pyPdf не может извлечь текст из некоторых страниц в моем PDF - PullRequest
6 голосов
/ 17 ноября 2010

Я пытаюсь использовать pyPdf для извлечения и печати страниц из многостраничного PDF.Проблема в том, что текст не извлекается из некоторых страниц.Я поместил здесь файл примера:

http://www.4shared.com/document/kmJF67E4/forms.html

Если вы запустите следующее, первые 81 страница не вернет текст, а последние 11 извлекут правильно.Кто-нибудь может помочь?

from pyPdf import PdfFileReader  
input = PdfFileReader(file("forms.pdf", "rb"))  
for page in input1.pages:  
    print page.extractText()  

Ответы [ 6 ]

8 голосов
/ 17 ноября 2010

Обратите внимание, что extractText() по-прежнему не удается правильно извлечь текст. Из документации на extractText():

Это хорошо работает для некоторых файлов PDF, но плохо для других, в зависимости от генератор используется. Это будет уточняется в будущем. Не полагайтесь на порядок текста, выходящий из этого функция, как это изменится, если это функция сделана более сложной.

Поскольку вам нужен именно этот текст, вы можете использовать команду Linux pdftotext.

Чтобы вызвать это с помощью Python, вы можете сделать это:

>>> import subprocess
>>> subprocess.call(['pdftotext', 'forms.pdf', 'output'])

Текст извлекается из forms.pdf и сохраняется в output.

Это работает в случае вашего PDF-файла и извлекает нужный текст.

1 голос
/ 27 января 2011

Это не совсем ответ, но проблема с pyPdf заключается в следующем: он еще не поддерживает CMaps. PDF позволяет шрифтам использовать CMaps для сопоставления идентификаторов символов (байтов в PDF) с кодами символов Unicode. Если у вас есть PDF, содержащий символы не ASCII, вероятно, используется CMap, и даже иногда, когда нет символов не ASCII. Когда pyPdf встречает строки, которые не находятся в стандартной кодировке Unicode, он просто видит кучу байтового кода; он не может конвертировать эти байты в Unicode, поэтому он просто дает вам пустые строки. У меня на самом деле была такая же проблема, и я сейчас работаю над исходным кодом. Это отнимает много времени, но я надеюсь отправить патч сопровождающему где-то в середине 2011 года.

1 голос
/ 17 ноября 2010

Вы также можете попробовать библиотеку pdfminer (также на python) и посмотреть, лучше ли извлечь текст. Однако для разбиения вам придется придерживаться pyPdf, поскольку pdfminer этого не поддерживает.

0 голосов
/ 08 января 2018

У меня была похожая проблема с некоторыми PDF-файлами и для Windows, это отлично работает для меня:

1.- Загрузить инструменты Xpdf для Windows

2.- скопируйте pdftotext.exe из xpdf-tools-win-4.00 \ bin32 в C: \ Windows \ System32, а также в C: \ Windows \ SysWOW64

3.- используйте подпроцесс для запуска команды из консоли:

import subprocess

try:
    extInfo = subprocess.check_output('pdftotext.exe '+filePath + ' -',shell=True,stderr=subprocess.STDOUT).strip()
except Exception as e:
    print (e) 
0 голосов
/ 17 ноября 2010

Я начинаю думать, что мне следует принять грязное решение из двух частей.в PDF есть два раздела: pp 1-82, в которых есть метки текстовых страниц (pdftotext может извлечь), и pp 83-end, в которых нет меток страниц, но pyPDF может извлечь и он явно знает страницы.

Я думаю, мне нужно объединить оба.Неуклюжий, но я не вижу способа обойти это.К сожалению, мне приходится делать это на компьютере с Windows.

0 голосов
/ 17 ноября 2010

Иногда бывает полезно преобразовать его в ps (попробуйте с pdf2ps и pdftops для разности потенциалов), а затем обратно в pdf (ps2pdf). Затем попробуйте ваш оригинальный сценарий снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...