2016-07-05 2 views
4

Правильный файл PDF был создан сценарием (выход которого не может быть напрямую написан на stdout, к сожалению). Скажем, имя файла - «myfile.pdf».Как распечатать файл pdf в stdout с помощью python?

Я хочу напечатать точный 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}).

EDIT: * Я ищу решение для python3 и для системы Linux/Unix, а не для окон. * Мне нужно знать, как это сделать в python, потому что на самом деле это часть более крупного проекта, полностью написанного на python.

+0

Почему вы не можете просто «cat some.pdf»? – armandino

+1

Возможный дубликат: http://stackoverflow.com/questions/2374427/python-2-x-write-binary-output-to-stdout –

+0

@armandino, потому что это на самом деле часть большого проекта, полностью написанного на питоне – 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 не может быть прочитано программой просмотра 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()) 
Смежные вопросы