PyPDF2:使用python3将输出写入标准输出失败

时间:2019-01-25 18:10:00

标签: python python-3.x pypdf2

我正在尝试将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写入stdout。

1 个答案:

答案 0 :(得分:1)

From the documentation

  

write(stream)

     

将添加到该对象的页面集合写为PDF文件。

     

参数: stream –写入文件的对象。该对象必须支持write方法tell方法,类似于文件对象。

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

说您的脚本称为myscript。如果仅调用myscript,则会收到此错误,但如果将其与重定向一起使用,则如下所示:

myscript > myfile.pdf

然后Python知道这是可搜索的流,并且您不会收到错误。