如何使用Python将PDF文件打印到标准输出?

4
一份正确的 PDF 文件已经由脚本生成(不幸的是,该脚本的输出不能直接写入标准输出 stdout)。假设文件名为“myfile.pdf”。
我想要将精确的 PDF 内容打印到标准输出 stdout 中(中间不做任何处理)。
为了测试这一点,我编写了这个简短的 read_pdf.py 脚本:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

with open('myfile.pdf', mode='rb') as pdf_file:
    for line in pdf_file:
        print(str(line))

我使用'rb'模式,因为在文本模式下读取会导致UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 10: invalid continuation byte错误。因此,似乎没有其他选择(如果文本模式无法工作,则使用二进制模式)。
当然,问题在于输出结果是由不能用作pdf文件的b'blablabla'行组成的。为了检查它,我将read_pdf.py重定向到一个文件中,并尝试使用pdf阅读器打开它,当然没有成功。
$ ./read_pdf.py > test_output.pdf
$ evince test_output.pdf
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't read xref table
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't read xref table

那么,正确的做法是什么呢?我没有查看任何专用的pdf库,因为这似乎不是必要的。我希望能够在不导入pdf库的情况下读取和打印正确的内容。

chardet.detect(pdf_file.read()) 无法帮助解决问题(它返回了{'encoding': None, 'confidence': 0.0})。

编辑: * 我正在寻找适用于Python 3和Linux/Unix系统的解决方案,而非Windows。 * 我需要知道如何使用Python完成此操作,因为它实际上是完全由Python编写的一个更大项目的一部分。


你为什么不能直接运行 cat some.pdf 呢? - armandino
1
可能是重复问题:https://dev59.com/lXE95IYBdhLWcg3wSb_P - Robᵩ
@armandino 因为它实际上是一个完全用Python编写的更大项目的一部分。 - zezollo
@Robᵩ 除了这个是针对Python3而不是关于Windows的。我会在问题中添加这些细节。 - zezollo
2个回答

0

我认为你的问题在于你是逐行读取,因此添加了额外的回车符。我尝试过,在OSX上完美运行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

with open('myfile.pdf', mode='rb') as pdf_file:
        print(pdf_file.read())

为了完整起见,正如@zezollo所指出的,在Linux中使用print函数仍会导致文件损坏,因此有必要直接在缓冲区中写入:

import sys

with open('myfile.pdf', mode='rb') as pdf_file:
    sys.stdout.buffer.write(pdf_file.read())

这很简单,比我的尝试要好,但输出仍然被“包含”在 b' ' 中。该输出无法被 PDF 查看器读取。因此,我天真地尝试打印 str(pdf_file.read())[2:-1]。这看起来不错,但也无法被 PDF 查看器读取。 - zezollo
我本以为在OSX和Linux中会有相同的行为,但显然在打印实现上存在一些差异。很高兴它能帮到你。 - rll

0
答案实际上是使用sys.stdout.buffer.write(),而不是print(),并且除了pdf_file.read()之外还要使用它:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys

with open('myfile.pdf', mode='rb') as pdf_file:
    sys.stdout.buffer.write(pdf_file.read())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接