【问题标题】:Merging PDF files with Python3使用 Python3 合并 PDF 文件
【发布时间】:2013-02-22 10:24:41
【问题描述】:

我正在编写一个需要合并许多单页 pdf 文件的小脚本。我希望脚本可以使用 Python3 运行,并且尽可能少地依赖。

对于 PDF 合并部分,我尝试使用 PyPdf。然而,对 Python 3 的支持似乎有问题。它无法处理 inkscape 生成的 PDF 文件(我需要)。我安装了当前 git 版本的 PyPdf,但以下测试脚本不起作用:

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 库的情况下解决它吗?

【问题讨论】:

    标签: python pdf python-3.x


    【解决方案1】:

    所以我找到了答案。 Python3.3 中的decimal.Decimal 模块显示了一些奇怪的行为。这是相应的 StackOverflow 问题:Instantiate Decimal class 我在 PyPDF2 库中添加了一些解决方法并提交了拉取请求。

    【讨论】:

    • 通过了吗?我也遇到了同样的问题。
    • 对不起,我点击了错误的链接。这是修复 bug 的正确(但仍在等待中,天知道为什么)拉取请求:click。这是this repo。
    • 顺便说一句,既然我安装了 PyPDF2,有没有办法只复制和粘贴一些文件?
    • 这是修复错误的提交:click 所以只需复制绿线并将其添加到文件系统中的适当位置即可。 (可能是/usr/lib/python2.7/site-packages/PyPDF2/generic.py:213
    • 非常感谢!尽管我无法让一般的东西用于合并,但我编写了一个避免“PdfMerger”的函数。
    【解决方案2】:

    只是为了确保您了解已经存在的工具可以做到这一点:

    • PDFtk
    • PDFjam(我的最爱,不过需要 LaTeX)
    • 直接与GhostScript:
      gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file1.pdf file2.pdf

    【讨论】:

    • 嗨,谢谢。但我发现 PyPDF 是一个不错的库,我想使用它。不过谢谢你的建议。
    • 只是想确保您没有重新发明轮子,而实际上您并不打算这样做;-)
    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 2016-10-02
    • 1970-01-01
    • 2012-03-29
    • 2014-04-19
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多