如何使用python将pdf文件打印到stdout?

时间:2016-07-05 18:29:30

标签: python linux python-3.x pdf readfile

脚本已创建了正确的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。所以,它看起来没有任何其他选择(如果文本模式不起作用,那么二进制模式)。

现在当然问题是输出包含b'blablabla'行,不能用作pdf文件。为了检查它,我将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})。

编辑: *我正在寻找python3和Linux / Unix系统的解决方案,而不是Windows。 *我需要知道如何在python中执行此操作,因为它实际上是完全用python编写的更大项目的一部分

2 个答案:

答案 0 :(得分: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())

答案 1 :(得分: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())