Fedora

在沒有 pdftk 的情況下從命令行合併 PDF 頁面的內容

  • June 26, 2018

我有兩個 PDF 文件,每個文件的頁數相同。我想要一個頁數相同的PDF文件,每一頁都是兩個源文件中相同頁數的疊加。如,第 1 頁文件 1 + 第 1 頁文件 2 = 生成的第 1 頁,等等。

使用 pdftk 我可以用一種簡單的方式做到這一點:

pdftk 文件1.pdf 多背景文件2.pdf 輸出文件3.pdf

但是,我現在需要在 Fedora 機器上執行此操作,而 Fedora 沒有 pdftk。而且我無法建構它,因為 libgcj abd gcc-java 也不存在。

作為最後的手段,我可​​以創建一個 OpenSUSE VM,因為 OpenSUSE 有 pdftk。但也許有一個工具可以做同樣的工作並且在 Fedora 上可用?

(我找到了 CoherentPDF,但它被許可“不用於商業用途”,這對我來說現在不可行)。

我不知道是否有一個純命令行解決方案,但 PyPDF2 可以做到這一點!如果您不熟悉 Python 程式,我剛剛改編了一個Gist來滿足您的需求。

以下程式碼也可作為Github Gist使用。

不要忘記執行sudo dnf install python3-PyPDF2並更改文件名。

#!/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)

編輯:請注意,這會默默地忽略具有更多頁面的 PDF 的超出頁面。如果需要,我可以為此提供更好的解決方案。

引用自:https://unix.stackexchange.com/questions/451670