2016-07-05 12 views
4

Eine korrekte PDF-Datei wurde von einem Skript erstellt (dessen Ausgabe leider nicht direkt in stdout geschrieben werden kann). Angenommen, der Dateiname lautet 'myfile.pdf'.Wie drucke ich eine PDF-Datei mit Python auf Standout?

Ich möchte den exakten PDF-Inhalt auf stdout drucken. (Keine Verarbeitung dazwischen).

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

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

ich den 'rb' Modus dies im Textmodus verwenden, führt zu einem UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 10: invalid continuation byte, da dem Lesen:

Um dies zu testen, habe ich diesen kurzen read_pdf.py Skript geschrieben. Es sieht also nicht so aus, als gäbe es keine andere Alternative (wenn der Textmodus nicht funktioniert, dann der Binärmodus).

Nun ist das Problem natürlich, dass die Ausgabe besteht aus b'blablabla' Zeilen, die nicht als PDF-Datei verwendet werden können. Um zu überprüfen, es, leite ich read_pdf.py in eine Datei und versuchen, es zu öffnen, mit einem PDF-Viewer und natürlich funktioniert es nicht:

$ ./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 

Also, was ist der richtige Weg, es zu tun? Ich habe keine pdf dedizierte Bibliothek überprüft, weil es nicht notwendig aussieht, ich würde gerne in der Lage sein, korrekte Inhalte zu lesen und zu drucken, ohne dafür eine PDF-Bibliothek zu importieren.

chardet.detect(pdf_file.read()) konnte nicht helfen (es zurückgegeben {'encoding': None, 'confidence': 0.0}).

EDIT: * Ich suche eine Lösung für python3 und für ein Linux/Unix-System, nicht Windows. * Ich muss wissen, wie dies in Python zu tun, weil es tatsächlich Teil eines größeren Projekts vollständig in Python geschrieben

+0

A Warum kannst du nicht einfach 'cat some.pdf'? – armandino

+1

Mögliche Duplikat: http://StackOverflow.com/Questions/2374427/Python-2-x-Write-Binary-Output-To-Stdout –

+0

@ Armandino, weil es tatsächlich Teil eines größeren Projekts vollständig in Python geschrieben – zezollo

Antwort

0

Ich denke, Ihr Problem ist, dass Sie Zeile für Zeile lesen, daher zusätzliche Wagenrückläufe hinzufügen. Ich habe versucht, und funktioniert perfekt auf OSX:

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

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

Aus Gründen der Vollständigkeit, wie @zezollo, in Linux stellte die Datei immer noch beschädigt wird, um die print-Funktion, so dass es notwendig ist, direkt auf den Puffer zu schreiben :

import sys 

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

Das ist tot einfach und besser als meine Versuche, aber die Ausgabe ist immer noch "eingeschlossen" in einem "b". Die Ausgabe kann vom PDF-Viewer nicht gelesen werden. Also habe ich naiv versucht, 'str (pdf_file.read()) [2: -1]' stattdessen zu drucken. Das sieht gut aus, kann aber auch vom pdf-Viewer nicht gelesen werden. – zezollo

+0

Ich hatte erwartet, das gleiche Verhalten in OSX und Linux zu haben, aber anscheinend gibt es einen Unterschied in der Druckimplementierung. Froh, dass es geholfen hat. – rll

0

Die Antwort ist eigentlich sys.stdout.buffer.write() zu verwenden, statt print(), und zusätzlich zu 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())