Как сделать водяные знаки на нескольких страницах с помощью PYPDF 2 более эффективными - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь написать короткий скрипт, который содержит 100 страниц pdf (~ 100 МБ), который является входным файлом. Я сделал файл водяных знаков размером ~ 60 КБ и пытаюсь создать вывод, объединяющий 2 файла, страницу за страницей, чтобы получить пронумерованный выходной файл. Файл водяного знака был создан reportlab, который представляет собой пустой документ на 100 страниц с правильными номерами страниц внизу (1,2,3,4,5, et c ...)

Хотя Сценарий работает, для его запуска потребовалось 13 минут с использованием посредственного четырехъядерного процессора, в среднем около 30% загруженности процессора и 5,5 ГБ оперативной памяти. Это намного больше, чем я ожидал, поскольку создание файла водяных знаков происходит практически мгновенно.

Размер выходного файла также составляет ~ 285 МБ, что намного больше, чем как для входного файла, так и для файла водяных знаков вместе взятых.

Код ниже:

def mergepdffiles(inputfile,outputfile,watermarkfile):
    template = PyPDF2.PdfFileReader(open(inputfile, 'rb'))
    watermark = PyPDF2.PdfFileReader(open(watermarkfile, 'rb'))
    output = PyPDF2.PdfFileWriter()
    for i in range(template.getNumPages()):
        page = template.getPage(i)
        page.mergePage(watermark.getPage(i))
        output.addPage(page)

    with open(outputfile, 'wb') as file:
        output.write(file)
    return None

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

В качестве альтернативы, есть ли более оптимальный способ добавления нижних колонтитулов на каждую страницу в многостраничном PDF без необходимости объединения двух существующих файлов? Я бы предположил, что это будет более эффективным.

...