gpt4 book ai didi

python - PyPDF2 : writing output to stdout fails with python3

转载 作者:行者123 更新时间:2023-12-01 08:24:28 26 4
gpt4 key购买 nike

我尝试使用Python 3.7.2和PyPDF2 1.26来选择输入PDF文件的某些页面并将输出写入stdout(实际代码更复杂,这只是一个MCVE):

import sys
from PyPDF2 import PdfFileReader, PdfFileWriter

input = PdfFileReader("example.pdf")
output = PdfFileWriter()
output.addPage(input.getPage(0))

output.write(sys.stdout)

此操作失败并出现以下错误:

UserWarning: File <<stdout>> to write to is not in binary mode. It may not be written to correctly. [pdf.py:453]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/site-packages/PyPDF2/pdf.py", line 487, in write
stream.write(self._header + b_("\n"))
TypeError: write() argument must be str, not bytes

问题似乎是 sys.stdout 未以二进制模式打开。正如一些答案所表明的那样,我尝试了以下方法:

output.write(sys.stdout.buffer)

此操作失败并出现以下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/site-packages/PyPDF2/pdf.py", line 491, in write
object_positions.append(stream.tell())
OSError: [Errno 29] Illegal seek

我也尝试过 Changing the way stdin/stdout is opened in Python 3 的答案:

sout = open(sys.stdout.fileno(), "wb")
output.write(sout)

此操作失败并出现与上面相同的错误。

如何使用 PyPDF2 库将 PDF 输出到标准输出?

更一般地说,如何正确地将 sys.stdout 切换到二进制模式(类似于 Perl 的 binmode STDOUT)?

注意:无需告诉我可以以二进制模式打开文件并将 PDF 写入该文件。这样可行;但是,我特别想将 PDF 写入标准输出。

最佳答案

From the documentation :

write(stream)

Writes the collection of pages added to this object out as a PDF file.

Parameters: stream – An object to write the file to. The object must support the write method and the tell method, similar to a file object.

事实证明,如果没有重定向到文件,sys.stdout.buffer 就无法tell,因此您不能将其用作的流>PdfFileWriter.write.

假设您的脚本名为 myscript。如果您仅调用 myscript,那么您将收到此错误,但如果您将其与重定向一起使用,如下所示:

myscript > myfile.pdf

然后 Python 就会知道这是一个可查找的流,并且您不会收到错误。

关于python - PyPDF2 : writing output to stdout fails with python3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54370724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com