[英]PyPDF2 compression
我正在努力使用 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 进行压缩后得到的文件大小。 有什么想法吗? 谢谢。
PyPDF2 没有可靠的压缩方法。 也就是说,有一个compress_content_streams()
方法,其描述如下:
通过加入所有内容流并应用 FlateDecode 过滤器来压缩此页面的大小。
但是,如果内容流压缩由于某种原因变为“自动”,则此函数可能不会执行任何操作。
同样,在大多数情况下这不会有任何区别,但您可以尝试以下代码:
from PyPDF2 import PdfReader, PdfWriter
writer = PdfWriter()
for pdf in ["path/to/hello.pdf", "path/to/another.pdf"]:
reader = PdfReader(pdf)
for page in reader.pages:
page.compress_content_streams()
writer.add_page(page)
with open("test_out2.pdf", "wb") as f:
writer.write(f)
您的错误说它必须是字符串或只读缓冲区,而不是文件。
所以最好将你的合并写入一个字节或字符串。
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'))
最初的方法并没有那么错误。 只需将页面添加到您的编写器并在写入文件之前对其进行压缩:
...
for i in list(range(reader.numPages)):
page = reader.getPage(i)
writer.addPage(page);
for i in list(range(writer.getNumPages())):
page.compressContentStreams()
...
pypdf
提供了几种减小文件大小的方法: https://pypdf.readthedocs.io/en/latest/user/file-size.html
compress_content_streams
是一个唯一的缺点,它可能需要很长时间(取决于 PDF;将其视为 ZIP-for-PDF):
from pypdf import PdfReader, PdfWriter
reader = PdfReader("example.pdf")
writer = PdfWriter()
for page in reader.pages:
page.compress_content_streams() # This is CPU intensive!
writer.add_page(page)
with open("out.pdf", "wb") as f:
writer.write(f)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.