2009-08-09 28 views
40

Ciao Conosco più PDF Generatori per php (fpdf, dompdf, ecc.) Quello che voglio sapere riguarda un parser.Esiste un parser PDF per PHP?

Per motivi indipendenti dalla mia volontà, alcune informazioni di cui ho bisogno sono solo in una tabella all'interno di un pdf e ho bisogno di estrarre tale tabella e convertirla in un array.

Qualche suggerimento?

+2

Dare una generosità a chiunque possa darci un esempio funzionante su come estrarre il testo di un pdf. La soluzione deve utilizzare librerie libere (no xPDF o PDF2Text) e indipendente dalla piattaforma (deve funzionare su win e unix, quindi nessun PDF2Text). Può usare la funzione exec() o shell() di PHP. – 2ndkauboy

+0

Grazie Kau-Boy. Forse una taglia aiuterà a motivare risposte più dettagliate. – elviejo79

risposta

1

Dai un'occhiata a GhostScript o ITextSharp, ci sono varie versioni multipiattaforma di entrambi.

1

Zend_Pdf è parte di Zend Framework. I loro manuale afferma:

Il componente Zend_Pdf è un PDF motore di manipolazione (Portable Document Format) . Può caricare, creare, modificare e salvare documenti. Così può aiutare qualsiasi applicazione PHP creare dinamicamente documenti PDF tramite modificando i documenti esistenti o generando nuovi da zero.

+0

+1 - I componenti di Zend Framework fanno in modo affidabile ciò che dicono di fare. – karim79

+5

Non credo che tu possa leggere il testo nei file PDF usando Zend_Pdf –

+0

Oltre a Zend_Pdf non supporta il formato PDF> 1.4 –

0

Esso non può in realtà essere un tavolo all'interno del PDF come il PDF perde questo genere di informazioni ...

3

Avete già guardato xPDF? C'è un programma in là chiamato pdftotext che farà la conversione. Puoi chiamarlo da PHP e poi leggere nella versione testuale del PDF. Dovrai avere la possibilità di eseguire exec() o system() da php, quindi questo potrebbe non funzionare su tutte le soluzioni ospitate.

Inoltre, ci sono alcuni esempi sullo PHP site che convertirà il PDF in testo, sebbene sia piuttosto approssimativo. Puoi provare anche alcuni di questi esempi. Su tale PHP page, cerca luc at phpt dot org.

+0

Ho provato xpdf basandomi sulle tue raccomandazioni, e sono rimasto sorpreso di come funziona - grazie! – Tomba

0

This è PHP PDF parser, che esiste in due versioni:

  1. versione gratuita può analizzare i file PDF fino al formato PDF 1.5
  2. commerciale add-on in grado di analizzare qualsiasi formato PDF (fino alla corrente 1.9)
+0

Quel link è morto, ma penso che questo sia un fork di esso: https://github.com/mark9000/FPDI – nullability

29

ne ho scritto uno prima (per esigenze simili), e posso dire questo: divertiti. È un compito abbastanza complesso. Il PDF specification è grande e ingombrante. Ci sono diversi metodi per memorizzare il testo al suo interno. E il kicker è che ogni generatore di PDF è diverso nel modo in cui funziona. Quindi, mentre qualcosa come TFPDF o DOMPDF crea VERAMENTE documenti PDF di facile lettura (da un punto di vista della macchina), Acrobat crea alcuni documenti davvero infernali.

Il motivo è come scrive il testo. La maggior parte dei renderer basati su DOM - che ho usato-- scrivono l'intera linea come una stringa e la posizionano una volta (che è davvero facile da leggere). Acrobat cerca di essere più efficiente (e lo è) scrivendo solo uno o forse pochi caratteri alla volta e posizionandoli in modo indipendente. Mentre questo semplifica davvero il rendering, rende la lettura MOLTO più difficile.

Il lato positivo qui è che il formato PDF è di per sé molto semplice. Hai "oggetti" che seguono una sintassi regolare.Quindi puoi collegarli insieme per generare il contenuto. La specifica fa un buon lavoro nel descrivere il formato del file. Ma la lettura del mondo reale sta andando a prendere un po 'di potenza del cervello ...

Alcuni pezzi utili di consigli che ho dovuto imparare nel modo più duro, se hai intenzione di scrivere voi stessi:

  1. Adobe piace ri-mappare i caratteri. Quindi il personaggio 65 probabilmente non sarà A ... È necessario trovare un oggetto mappa e dedurre cosa sta facendo in base a quali caratteri ci sono dentro. Ed è efficiente dal momento che se un carattere non appare nel documento per quel tipo di carattere, non lo include (il che rende difficile la vita se provi a modificare un PDF a livello di programmazione) ...
  2. Scrivilo astratto come possibile. Scrivi classi per ogni tipo di oggetto e ogni tipo nativo (stringhe, numeri, ecc.). Lascia che quelle classi si analizzino per te. Ci sarà un bel po 'di ripetizione, ma ti risparmierai alla fine quando ti rendi conto che devi modificare qualcosa per un solo tipo specifico ...
  3. Scrivi per una versione specifica o due dei Specifiche PDF e applicarlo. Controlla il numero di versione, e se è più alto di quanto ti aspetti, cauzione ... E non provare a "farlo funzionare". Se si desidera supportare le versioni più recenti, suddividere le specifiche e aggiornare il parser da lì. Non provare a tentativi ed errori (non è divertente) ...
  4. Buona fortuna con flussi compressi. Ho scoperto che in genere non ci si può fidare degli argomenti di lunghezza per verificare cosa non si sta comprimendo. A volte (per alcuni generatori) funziona bene ... Altri è spento da uno o più byte. Ho appena tentato di svuotare se il filtro corrisponde e quindi forzare la lunghezza ...
  5. Durante il test delle lunghezze, non utilizzare strlen. Utilizzare mb_strlen($string, '8bit') poiché compenserà set di caratteri diversi (e consentirà caratteri potenzialmente non validi in altri set di caratteri).

In caso contrario, buona fortuna ...

+2

+1 Potrei anche chiamarlo incubo. Le specifiche sono enormi, un file PDF assomiglia quasi a un filesystem con così tante opzioni e scelte all'interno ... puoi certamente vedere come possono nascondere le capacità di prigione là dentro. – Rudu

+2

Ci si aspetterebbe qualcosa di meno da Adobe? – bpeterson76

+0

@ bpeterson76, si .. Non voglio che i miei PDF siano scaricabili :( –