2016-07-05 146 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())