2016-07-05 150 views
4

一个正确的pdf文件已经由脚本创建(不幸的是,其输出不能直接写入标准输出)。说这个文件的名字是'myfile.pdf'。如何使用python打印PDF文件到标准输出?

我想打印确切的PDF内容到标准输出。 (中间没有处理)。

为了测试这一点,我写了这个简短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编写的较大项目的一部分

+0

一你有什么理由不能'猫some.pdf'? – armandino

+1

可能的重复:http://arrowover.com/questions/2374427/python-2-x-write-binary-output-to-stdout –

+0

@armandino,因为它实际上是一个更大的项目的一部分,完全用Python编写 – zezollo

回答

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()) 
+0

这是简单的,比我的尝试更好,但输出仍然“封闭”在一个'b'''内。 PDF查看器无法读取输出。所以我天真地尝试打印'str(pdf_file.read())[2:-1]'。这看起来不错,但不能被PDF阅读器阅读。 – zezollo

+0

我期望在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())