2016-07-05 8 views
4

正しいpdfファイルがスクリプトによって作成されています(出力はstdoutに直接書き込むことはできませんが、残念ながら)。ファイルの名前が 'myfile.pdf'であるとします。pythonを使ってpdfファイルをstdoutにプリントするには?

正確なpdfコンテンツをstdoutに出力したいと思います。 (間に処理はありません)。これをテストする

、私はこの短いread_pdf.pyスクリプト書いた:テキストモードでこれを読むことUnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 10: invalid continuation byteにつながるので、私は'rb'モードを使用

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

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

を。だから、他の選択肢がないように見えます(テキストモードが動作しない場合、バイナリモード)。

もちろん、問題は、出力が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

Aあなたはちょうど 'cat some.pdf'できないのですか? – armandino

+1

可能な複製:http://stackoverflow.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

答えが代わりにprint()の、sys.stdout.buffer.write()を使用することが実際にあり、かつ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()) 
関連する問題