2010-11-17 25 views
6

Sto provando a utilizzare pyPdf per estrarre e stampare pagine da un PDF multipagina. Il problema è che il testo non viene estratto da alcune pagine. Ho messo un file di esempio qui:pyPdf impossibile estrarre il testo da alcune pagine nel mio PDF

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

Se si esegue il seguente, le prime 81 pagine restituiscono alcun testo, mentre la finale 11 estratto correttamente. Qualcuno può aiutare?

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

risposta

6

noti che extractText() ha ancora problemi durante l'estrazione del testo in modo corretto. Dalla documentazione per extractText():

Questo funziona bene per alcuni file PDF, ma poco per gli altri, a seconda generatore utilizzato. Questo sarà perfezionato in futuro. Non fare affidamento su l'ordine di testo che esce da questa funzione , poiché cambierà se questa funzione è resa più sofisticata.

Poiché è il testo che si desidera, è possibile utilizzare il comando Linux pdftotext.

Per invocare che l'utilizzo di Python, si può fare questo:

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

Il testo viene estratto da forms.pdf e salvato output.

Questo funziona nel caso del file PDF ed estrae il testo desiderato.

+0

Grazie per il vostro aiuto. Ho provato pdftotext e l'ho passato in quanto risolve solo parzialmente il problema. Ho bisogno di dividere il pdf in file separati sulla base di UID che si trovano su ogni pagina. Comunque le ultime 10 pagine, che pyPdf può estrarre, non hanno etichette testuali, quindi usare pdftotext, mentre mi dà tutto il testo, non mi dà modo di generare un elenco di pagine per un dato UID . – DrJAKing

+0

Questo non fa un brutto lavoro di output del testo del PDF, ma non preserva la formattazione della tabella. – s2t2

1

Si potrebbe anche provare la libreria pdfminer (anche in python) e vedere se è meglio estrarre il testo. Tuttavia, per la suddivisione, è necessario attenersi a pyPdf poiché pdfminer non lo supporta.

+0

Ho provato pdfminer ... le ultime pagine non vengono estratte correttamente per qualche motivo. – DrJAKing

0

Trovo a volte utile per convertirlo in ps (provare con pdf2ps e pdftops per differenze di potenziale), poi di nuovo a pdf (ps2pdf). Quindi prova di nuovo lo script originale.

+0

Ero fiducioso, ma tutto ciò che sembra fare è ingrandire il file originale e rallentare l'estrazione del testo null! – DrJAKing

+0

@DrJAKing: Scusa, ha funzionato per me "alcune volte", non sempre. – Danosaure

0

Sto iniziando a pensare che dovrei adottare una soluzione disordinata in due parti. ci sono due sezioni per il PDF, pp 1-82 che hanno etichette di pagine di testo (pdftotext può estrarre) e pp 83-end che non hanno etichette di pagina ma pyPDF può estrarre e conosce esplicitamente le pagine.

Penso di aver bisogno di combinare i due. Clunky, ma non vedo alcun modo attorno ad esso. Purtroppo sto facendo questo su una macchina Windows.

1

Questa non è davvero una risposta, ma il problema con pyPdf è questo: non supporta ancora CMaps. PDF consente ai caratteri di utilizzare CMaps per mappare gli ID carattere (byte nel PDF) ai codici carattere Unicode. Quando hai un PDF che contiene caratteri non ASCII, probabilmente c'è un CMap in uso, e talvolta anche quando non ci sono caratteri non ASCII. Quando pyPdf incontra stringhe che non sono nella codifica Unicode standard, vede solo un mucchio di codice byte; non può convertire quei byte in Unicode, quindi ti dà solo stringhe vuote. In realtà ho avuto questo stesso problema e sto lavorando al codice sorgente al momento. È dispendioso in termini di tempo, ma spero di inviare una patch al manutentore verso la metà del 2011.

0

Ho avuto simile problema con alcuni file PDF e per le finestre, questo sta lavorando eccellente per me:

1.- strumenti Scarica Xpdf per Windows

2.- copia pdftotext.exe da xpdf-strumenti- win-4.00 \ bin32 a C: \ Windows \ System32 e anche di C: \ Windows \ SysWOW64

3.- uso sottoprocesso per eseguire il comando da console:

import subprocess 

try: 
    extInfo = subprocess.check_output('pdftotext.exe '+filePath + ' -',shell=True,stderr=subprocess.STDOUT).strip() 
except Exception as e: 
    print (e) 
Problemi correlati