Создавайте PDF-файлы из шаблонов с помощью Python и Google Scripts

Часто полезно создавать PDF-файлы из ваших скриптов Python. Независимо от того, создаете ли вы счета, письма, отчеты или любые другие документы, которые содержат много повторов форматирования, но лишь немного динамического содержимого, автоматизация может сэкономить вам много часов.

У вас есть несколько вариантов для этого. Обычные:

  1. Используйте библиотеку PDF, например отчет для создания файлов PDF напрямую (например,
  2. Используйте библиотеку шаблонов HTML, например Джинджа2 и конвертировать из HTML в PDF (например, см.
  3. Используйте сторонний API, например

Для Варианта 1 создание PDF-файлов непосредственно из Python может сильно затруднить форматирование. Вы должны рисовать все, что вам нужно, элемент за элементом, используя код, и даже если у вас есть шаблон, который выглядит так, как вы хотите, его трудно поддерживать.

Вариант 2 часто может работать лучше, но вам все равно придется создавать HTML-шаблон Jinja, и иногда преобразование HTML в PDF получается не совсем так, как вы ожидали.

Вариант 3 требует, чтобы вы сначала создали шаблон с помощью веб-интерфейса онлайн-сервиса. Хотя вы получаете интерфейс перетаскивания, довольно неуклюже и сложно заставить ваш шаблон выглядеть так, как вы хотите. Как правило, вы также должны платить за использование сервиса.

Хотя один из вышеперечисленных вариантов может подойти вам, если вам не нравится ни один из них, вы также можете собрать API для создания документов на основе Google Диска. Вы получите бесплатный API и сможете использовать Документы Google в качестве инструмента для создания шаблонов, который является довольно мощным и имеет множество уже существующих шаблонов для таких вещей, как счета, письма и резюме.

Я начал с шаблона счета, который нашел в Интернете. Это выглядит так:

Шаблон счета-фактуры Документов Google

В этом руководстве мы рассмотрим создание API, который генерирует эти счета и позволяет программно вставлять номер счета из внешнего скрипта Python. На самом деле вам нужно будет сделать то же самое для многих других полей, но мы начнем с простого примера для демонстрации.

Мы напишем несколько строк кода Google App Script и несколько строк кода Python.

Создание шаблона документа

Используйте один из встроенных шаблонов документов Google, найдите в Интернете тот, который соответствует вашим потребностям, или создайте свой собственный на docs.google.com. (Вам понадобится учетная запись Google).

Добавляйте заполнители там, где вам нужна динамическая информация. В приведенном ниже примере я добавил СЧЕТ № {invoice_id} вместо идентификатора «456», который был у меня в исходном документе. В этом синтаксисе нет ничего особенного — позже мы будем использовать базовую функцию поиска и замены, чтобы заменить ее реальной информацией, поэтому используйте то, что вряд ли появится в окончательном документе.

Запишите идентификатор своего документа, который выделен в строке URL.

Шаблон счета-фактуры с заполнителем

Настройка пользовательского скрипта Google

Перейдите на Google Диск, нажмите «Создать» в левом верхнем углу. В разделе «Дополнительно» выберите «Сценарий Google Apps», если он доступен, или «Подключить другие приложения», если вы его не видите.

Подключение дополнительных приложений

Найдите «скрипт приложений» и выберите его для подключения. Вы можете увидеть некоторые предупреждающие сообщения с вопросом, доверяете ли вы себе. Скажите, что вы делаете.

Добавление скрипта приложений

Как только вы сможете создать новый сценарий приложения, вы увидите пустой сценарий по умолчанию, который выглядит следующим образом.

Пустой скрипт Google Apps

Удалите код, который вы там видите, и замените его на createDocument функция, которая выглядит следующим образом.

function createDocument(invoice_id) {
  var TEMPLATE_ID = '1Ybq8r_SiWu4Z4-_Z6S0IW1L8FJywfpjPAATPCvvkKk8';  
  var documentId = DriveApp.getFileById(TEMPLATE_ID).makeCopy().getId();
  
  drivedoc = DriveApp.getFileById(documentId);
  drivedoc.setName("Invoice " + invoice_id);
  
  doc = DocumentApp.openById(documentId);
  
  var body = doc.getBody();
  
  body.replaceText('{invoice_id}', invoice_id);
  drivedoc.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);

  return " + documentId + "/export?format=pdf";
}

В строке 2 отключите TEMPLATE_ID с идентификатором документа, который вы скопировали из строки URL в шаблоне Google Doc.

Этот код находит шаблонный документ, создает его копию и задает имя файла «Счет-фактура» плюс что угодно. invoice_id мы передаем. Затем он открывает новый файл через DocumentApp (вместо приложения Drive, чтобы мы могли фактически получить содержимое файла и отредактировать его). Он ищет в документе добавленный нами заполнитель ({invoice_id}) и заменяет его фактическим invoice_id которые функция принимает на вход. Затем он делает документ общедоступным и возвращает URL-адрес, который будет напрямую использоваться для экспорта этого документа в PDF.

Ниже этой функции добавьте еще одну с именем doGet. Хотя предыдущую функцию можно назвать как угодно, doGet — это специальная функция в скриптах Google Apps, поэтому вам нужно назвать ее точно doGet. Эта функция будет обрабатывать входящие веб-запросы после того, как мы развернули наше приложение.

Код для doGet функция следующая. Вставьте это ниже предыдущего createDocument() функция.

function doGet(e) {
  var invoice_id = e.parameter.invoice_id;
  var url = createDocument(invoice_id);
  return ContentService.createTextOutput(url);
}

Он принимает invoice_id в качестве параметра URL и передает его нашему createDocument которую мы только что написали, и возвращает URL-адрес созданного документа в виде обычного текста.

Публикация нашего API

В меню «Опубликовать» выберите «Развернуть как веб-приложение».

Развернуть как веб-приложение

Вас попросят назвать проект. Дайте ему имя, например «PDF API» или что-то еще, что вы хотите.

Название проекта

Вы увидите новое меню для установки параметров развертывания вашего веб-приложения.

Варианты развертывания

Добавьте сообщение типа «начальное развертывание» в разделе «Новое» и выберите «Любой, даже анонимный» в настройках доступа. В настройках выполнения оставьте значение «Я».

Предупреждение: Если вы поделитесь ссылкой в ​​общедоступном месте, люди могут злоупотреблять сервисом и спамить его автоматическими запросами. В этом случае Google может заблокировать вашу учетную запись за неправомерное использование, поэтому сохраняйте ссылку в безопасном месте.

Нажмите кнопку «Развернуть» и запишите URL-адрес, который вы видите в следующем всплывающем окне.

URL вашего приложения

Добавьте «?invoice_id=1» в конец URL-адреса и откройте его в своем браузере. Это должно выглядеть примерно так

Если все прошло хорошо, вы должны увидеть ссылку на Документы Google.

Ответ от нашего веб-приложения

Если вы перейдете по URL-адресу, PDF-файл счета с замененным заполнителем на 1 следует скачать.

Обновление приложения

Если вместо этого вы видите ошибку или не получаете ответа, возможно, вы допустили ошибку в коде. Вы можете изменить его и обновить развертывание так же, как вы его изначально развернули. Экран обновления лишь немного отличается от экрана развертывания.

Обновить параметры развертывания

Единственная сложность в том, что ты имеют чтобы выбрать «Новую» в качестве версии для каждого внесенного вами изменения. Если вы внесете изменения в код и обновите предыдущую версию, изменения не вступят в силу, что не очевидно из пользовательского интерфейса. (Вы можете видеть, что мне потребовалось несколько попыток, чтобы сделать это правильно.).

Создание наших счетов из Python

Теперь мы можем создавать счета и сохранять их локально из скрипта Python. В следующем коде показано, как сгенерировать три счета за один for петля.

import requests

url = "

invoice_ids = ["123", "456", "789"]

for invoice_id in invoice_ids:
    print("processing ", invoice_id)
    response = requests.get(url.format(invoice_id))
    print("file generated")
    response = requests.get(response.content)
    print("file downloaded")
    with open("invoice{}.pdf".format(invoice_id), "wb") as f:
        f.write(response.content)

Обратите внимание, что процесс создания и загрузки довольно медленный, поэтому для каждого создаваемого вами счета потребуется несколько секунд.

Вы, наверное, заметили, что это довольно «хакерское» решение для создания PDF-файлов изнутри Python. Функциональность «замены» довольно ограничена по сравнению с надлежащим языком шаблонов, и передача данных через запрос на получение также имеет ограничения. Если вы передаете что-то более сложное, чем идентификатор счета, вы должны сначала закодировать данные в URL. Вы можете сделать это в Python, используя urllib.parse модуль. Пример модификации сценария Python для работы с более сложными данными выглядит следующим образом.

import requests
import urllib.parse

url = "

invoice_ids = ["A longer ID with special characters $% ! --*?+"]

for invoice_id in invoice_ids:
    print("processing ", invoice_id)
    payload = {"invoice_id": invoice_id}
    u = url + urllib.parse.urlencode(payload)
    response = requests.get(u)
    print("file generated")
    response = requests.get(response.content)
    print(response.content)
    print("file downloaded")
    with open("invoice{}.pdf".format(invoice_id), "wb") as f:
        f.write(response.content)

Но по-прежнему существуют ограничения на то, какие данные и сколько вы можете передавать, просто используя URL-адреса, поэтому вам нужно будет изменить сценарий, чтобы вместо этого использовать POST-запросы, если вы отправляете много динамических данных.

Это также довольно медленно по сравнению с некоторыми другими методами, которые мы обсуждали в начале, и Google некоторые ограничения от того, сколько файлов вы можете создать автоматически таким образом.

Тем не менее, возможность создавать шаблоны с помощью Google Docs может быть быстрой и мощной, поэтому вам нужно будет оценить компромиссы для себя.

Также обратите внимание, что это довольно надуманный пример, в котором мы могли бы запустить скрипт Python из экосистемы Google и избежать необходимости настраивать общедоступный API, которым потенциально могли бы злоупотреблять, если бы другие люди обнаружили URL-адрес. Однако у вас может быть существующее приложение Python, не размещенное в Google, которое вам необходимо подключить к автоматически сгенерированным PDF-файлам, и этот метод по-прежнему позволяет вам настроить автономный «микросервис» в экосистеме Google, который позволяет легко создавать PDF-файлы. поколение.

Вывод

Если у вас возникли проблемы с настройкой, вы заметили какие-либо ошибки или знаете лучший способ создания PDF-файлов в Python, оставьте комментарий ниже или отправьте мне сообщение. в Твиттере. Вам также могут понравиться другие мои уроки.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *