【问题标题】:PyPDF2 compressionPyPDF2 压缩
【发布时间】:2014-05-11 15:59:47
【问题描述】:

我正在努力使用 PyPDF2 模块压缩我合并的 pdf。这是我基于http://www.blog.pythonlibrary.org/2012/07/11/pypdf2-the-new-fork-of-pypdf/的尝试

import PyPDF2
path = open('path/to/hello.pdf', 'rb')
path2 = open('path/to/another.pdf', 'rb')
merger = PyPDF2.PdfFileMerger()
merger.append(fileobj=path2)
merger.append(fileobj=path)
pdf.filters.compress(merger)
merger.write(open("test_out2.pdf", 'wb'))

我收到的错误是

TypeError: must be string or read-only buffer, not file

我也尝试在合并完成后压缩 pdf。我将失败的压缩基于使用 PDFSAM 进行压缩后得到的文件大小。 有什么想法吗?谢谢。

【问题讨论】:

  • pdf 未在您的代码示例中的任何位置定义。它是什么?另外,请提供完整的回溯,以便我们查看是哪一行导致了问题。

标签: python pdf pypdf2


【解决方案1】:

PyPDF2 没有可靠的压缩方法。也就是说,有一个 compressContentStreams() 方法,其描述如下:

通过加入所有内容流并应用 FlateDecode 过滤器来压缩此页面的大小。

但是,如果内容流压缩由于某种原因变为“自动”,则此函数可能不会执行任何操作。

同样,这在大多数情况下不会有任何区别,但您可以尝试以下代码:

import PyPDF2

path = 'path/to/hello.pdf'
path2 = 'path/to/another.pdf'
pdfs = [path, path2]

writer = PyPDF2.PdfFileWriter()

for pdf in pdfs:
    reader = PyPDF2.PdfFileReader(pdf)
    for i in xrange(reader.numPages):
        page = reader.getPage(i)
        page.compressContentStreams()
        writer.addPage(page)

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

【讨论】:

    【解决方案2】:

    您的错误表明它必须是字符串或只读缓冲区,而不是文件。

    所以最好将你的合并写入一个字节或字符串。

    import PyPDF2
    from io import BytesIO
    
    tmp = BytesIO()
    path = open('path/to/hello.pdf', 'rb')
    path2 = open('path/to/another.pdf', 'rb')
    merger = PyPDF2.PdfFileMerger()
    merger.append(fileobj=path2)
    merger.append(fileobj=path)
    merger.write(tmp)
    PyPDF2.filters.compress(tmp.getvalue())
    merger.write(open("test_out2.pdf", 'wb'))
    

    【讨论】:

      【解决方案3】:

      最初的方法并没有那么错误。只需将页面添加到您的编写器并在写入文件之前压缩它们:

      ...
      
      for i in list(range(reader.numPages)):
          page = reader.getPage(i)
          writer.addPage(page);
      for i in list(range(writer.getNumPages())):
          page.compressContentStreams()
      
      ...
      

      【讨论】:

        猜你喜欢
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-19
        • 2018-06-25
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多