Mesclar conteúdo de páginas PDF a partir da linha de comando sem pdftk

1

Eu tenho dois arquivos PDF, cada um com o mesmo número de páginas. Eu quero um arquivo PDF com o mesmo número de páginas, e cada página é uma sobreposição das páginas do mesmo número nos dois arquivos de origem. Como em, página 1 arquivo 1 + página 1 arquivo 2 = resultante página 1, etc.

Com pdftk eu posso fazer isso de uma maneira simples:

pdftk file1.pdf multibackgroud file2.pdf arquivo de saída3.pdf

No entanto, agora preciso fazer isso em uma máquina do Fedora, e o Fedora não tem o pdftk. E eu não posso construí-lo porque libgcj abd gcc-java também estão ausentes.

Como último recurso, posso criar uma VM do OpenSUSE, já que o OpenSUSE tem o pdftk. Mas talvez haja uma ferramenta que possa fazer o mesmo trabalho e esteja disponível no Fedora?

(Eu encontrei o CoherentPDF, mas ele é licenciado "não para uso comercial", o que não é algo viável para mim agora).

    
por Mikhail Ramendik 25.06.2018 / 04:05

1 resposta

2

Eu não sei se existe uma solução de linha de comando pura para isso, mas o PyPDF2 pode fazer o truque! Acabei de adaptar um Gist que eu encontrei para atender às suas necessidades, caso você não esteja familiarizado com a programação em Python.

O seguinte código também está disponível como Github Gist .

Não se esqueça de fazer um sudo dnf install python3-PyPDF2 e alterar os nomes dos arquivos.

#!/bin/python3


from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.pdf import PageObject

# Theses files are just for testing, no point in merging these
reader = PdfFileReader(open("Nextcloud Manual.pdf",'rb'))

# this defines the output page format (relevant if not the same)
sup_reader = PdfFileReader(open("Cplusplus.pdf",'rb'))

writer = PdfFileWriter()

for pageNo in range(min(reader.getNumPages(), sup_reader.getNumPages())):
    print("Merging page:", pageNo)
    invoice_page = reader.getPage(pageNo)
    sup_page = sup_reader.getPage(pageNo)
    translated_page = PageObject.createBlankPage(None, sup_page.mediaBox.getWidth(), sup_page.mediaBox.getHeight())
    translated_page.mergeScaledTranslatedPage(sup_page, 1, 0, 0)

    translated_page.mergePage(invoice_page)

    writer.addPage(translated_page)

with open('out.pdf', 'wb') as f:
    writer.write(f)

Editar: observe que isso silenciosamente ignora as páginas excedentes do PDF que tem mais páginas. Eu poderia fornecer uma solução melhor para isso, se necessário.

    
por 26.06.2018 / 13:54