2013-02-22 143 views
1

我在寫一個需要合併很多單頁pdf文件的小腳本。我希望腳本能夠使用Python3運行,並儘可能少地依賴。用Python3合併PDF文件

對於PDF合併部分,我嘗試使用PyPdf。但是,Python 3的支持似乎是錯誤的;它無法處理Inkscape生成的PDF文件(我需要)。我安裝PyPdf當前Git版本,下面的測試腳本不起作用:

import PyPDF2 

output_pdf = PyPDF2.PdfFileWriter() 

with open("testI.pdf", "rb") as input: 
    input_pdf = PyPDF2.PdfFileReader(input) 
    output_pdf.addPage(input_pdf.getPage(0)) 

with open("test.pdf", "wb") as output: 
    output_pdf.write(output) 

這將引發以下堆棧跟蹤:

Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    output.addPage(input.getPage(0)) 
    File "/usr/lib/python3.3/site-packages/pyPdf/pdf.py", line 420, in getPage 
    self._flatten() 
    File "/usr/lib/python3.3/site-packages/pyPdf/pdf.py", line 574, in _flatten 
    self._flatten(page.getObject(), inherit) 
    File "/usr/lib/python3.3/site-packages/pyPdf/generic.py", line 165, in getObject 
    return self.pdf.getObject(self).getObject() 
    File "/usr/lib/python3.3/site-packages/pyPdf/pdf.py", line 616, in getObject 
    retval = readObject(self.stream, self) 
    File "/usr/lib/python3.3/site-packages/pyPdf/generic.py", line 66, in readObject 
    return DictionaryObject.readFromStream(stream, pdf) 
    File "/usr/lib/python3.3/site-packages/pyPdf/generic.py", line 526, in readFromStream 
    value = readObject(stream, pdf) 
    File "/usr/lib/python3.3/site-packages/pyPdf/generic.py", line 57, in readObject 
    return ArrayObject.readFromStream(stream, pdf) 
    File "/usr/lib/python3.3/site-packages/pyPdf/generic.py", line 152, in readFromStream 
    obj = readObject(stream, pdf) 
    File "/usr/lib/python3.3/site-packages/pyPdf/generic.py", line 86, in readObject 
    return NumberObject.readFromStream(stream) 
    File "/usr/lib/python3.3/site-packages/pyPdf/generic.py", line 231, in readFromStream 
    return FloatObject(name.decode("ascii")) 
    File "/usr/lib/python3.3/site-packages/pyPdf/generic.py", line 207, in __new__ 
    return decimal.Decimal.__new__(cls, str(value), context) 
TypeError: optional argument must be a context 

相同的腳本,但是,與完美的作品Python 2.7。

我在這裏做錯了什麼?這是圖書館的一個錯誤嗎?我可以在不觸摸PyPDF庫的情況下解決它嗎?

回答

3

所以我找到了答案。 Python3.3中的decimal.Decimal模塊顯示了一些奇怪的行爲。這是相應的StackOverflow問題:Instantiate Decimal class我向PyPDF2庫添加了一些解決方法,並提交了一個pull請求。

+0

它經歷了嗎?我患有同樣的問題。 – PascalVKooten 2013-03-30 21:29:19

+1

這[回購](https://github.com/colemana/PyPDF2)是一個固定版本。 – janoliver 2013-04-02 20:11:10

+0

這個回購是1歲?你確定它有效嗎? – PascalVKooten 2013-04-03 05:01:02

2

只是爲了確保你意識到這一點做的正是這種已經存在的工具:

  • PDFtk
  • PDFjam(我最喜歡的,需要儘管膠乳)
  • 直接與GhostScript
    gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file1.pdf file2.pdf
+0

嗨,謝謝。但是我發現PyPDF是一個不錯的庫,並希望使用它。但是,謝謝你的建議。 – janoliver 2013-02-22 10:41:39

+0

只是想確保你沒有重新發明輪子,當你實際上並不意味着;-) – 2013-02-22 10:58:37