Подтвердить что ты не робот

Как создавать pdf-документы по страницам в фоновых задачах в App Engine

Мне нужно создать PDF-документы на 100 страниц. Процесс обрабатывает много данных для обработки, и для генерации "все-в-одном" требуется больше времени и памяти, которые я могу дать.

Я пробовал несколько разных способов взломать мой путь:

  • xhtml2pdf с HTML-преобразованием и преобразованием
  • rportlab для создания некоторых страниц и
  • pyPdf для слияния

С меняющимся результатом я получил его работу, но он медленный и занимает больше памяти, чем должен (иногда ударяя по типу памяти в памяти). В настоящее время я создаю несколько разделов в разных задачах, сохраняя их каждый в blobstore и объединяя их с pyPdf, но он зажимает большие документы.

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

Цель состоит в том, чтобы сгенерировать документ так быстро, как позволяет хранилище данных. Параллельное создание страниц было бы неплохо, но не требовалось.

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

Итак, мой вопрос:

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

Если расщепление генерации невозможно с помощью reportlab, то как свести к минимуму объем слияния разных PDF-документов, чтобы он соответствовал ограничениям, заданным запросом задачи GAE?

UPDATE: Альтернативы API конверсии очень ценятся.

2nd UPDATE API конверсии списывается, так что теперь не вариант.

3rd UPDATE Может ли помочь Pileline или MapReduce API?

4b9b3361

Ответ 2

Я предлагаю установить wkhtmltopdf на движок приложения. Wkhtmltopdf - инструмент командной строки для рендеринга html в pdf.

Создайте html файлы, а затем конвертируйте их в pdf один за другим с помощью wkhtmltopdf.

В окнах вы можете использовать (под Linux-системами это нечто похожее):

def create_pdf(in_html_file=None, out_pdf_file=None, quality=None):
    pathtowk = 'C:/wkhtmltopdf/bin/wkhtmltopdf.exe {0} {1} {2}'    

    if quality == 1: # super quality no compression
        args_str = '--encoding utf-8 --disable-smart-shrinking --no-pdf-compression --page-size A4 --zoom 1 -q -T 15.24mm -L 25.4mm -B 20.32mm  -R 33.02mm'
    elif quality == 2: # moderate quality some compression
        args_str = '--encoding utf-8 --disable-smart-shrinking --page-size A4 --zoom 1 -q -T 15.24mm -L 25.4mm -B 20.32mm  -R 33.02mm'
    else: # poor quality max compression
        args_str = '--encoding utf-8 --page-size A4 --zoom 1 -q -T 15.24mm -L 25.4mm -B 20.32mm  -R 33.02mm'

    os.system(pathtowk.format(args_str, in_html_file, out_pdf_file))

В качестве альтернативы вы можете использовать subprocess.call(pathtowk.format(args_str, in_html_file, out_pdf_file)) для выполнения wkhtmltopdf (это лучше, на мой взгляд).

Когда процесс преобразования завершится, используйте PyPdf2 для слияния сгенерированных PDF файлов в один файл.