Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [Java] Scorrere un PDF

  1. #1
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755

    [Java] Scorrere un PDF

    Ciao a tutti
    un amico mi ha chiesto un programmino che scorre files pdf ed estrapola alcune informazioni. questi pdf sono creati da un SW su cui non posso intervenire. I pdf sono strutturati come nell'allegato (estremamente semplificato)
    A me interessa reperire, nell'esempio, i dati 3,8 e 9.
    Per farlo ho usato il framework iText
    Il problema è che (penso) la struttura dei pdf viene continuamente modificata, ad esempio: a volte se scorro i Token su un file pdf mi arrivano in sequenza 0 I, 9 H, 8 G etc, altre 0 9 8 7 6 I H G F E 1 A etc.
    Mi chiedo se sia possibile verificare la presenza di "segnalibri", qualcosa che mi dica "ehi sono A" così da non dover ogni volta cercare di capire la sequenza.

    Avete esperienza con iText per fare ciò?
    L'avete fatto con altri framework?


    allegato:
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  2. #2
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    sto cercando di usare gli esempi, nella fattispecie questo. sono riuscito a compilare però quando provo ad eseguire ricevo questi errori
    C:\symo\prove\java\iText>java InspectPageContent
    Exception in thread "main" java.lang.NoClassDefFoundError: InspectPageContent (wrong name: part4/chapter15/InspectPageContent)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknow n Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.launcher.LauncherHelper.checkAndLoadMain(Unkno wn Source)
    qualcuno ha idea del perchè?
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    Scusa la domanda banale, ma hai copiato il codice e basta? Hai scaricato e inserito correttamente nel path tutte le risorse accessorie? Del tipo:

    1. la classe part1.chapter03.MovieTemplates
    2. iText.jar
    3. hsqldb.jar

    Poi se esegui dal tuo pc dovresti controllare (molto probabilmente cambiare) la costante RESULT.

    Per rispondere anche al tuo primo post, non è facile come sembra implementare ciò che vuoi per un semplice motivo: i file pdf in genere non hanno un "marker" che avvisa quando sta per arrivare una tabella... per questo motivo iText e altri (un altro degno di nota a mio parere è PDFBox) non sono impeccabili, ma devi trovare tu un metodo per fare il parsing di ciò che ti interessa...

    Edit: L'esempio dice anche che utilizza "filmfestival.script" che è un dump di un database...

    Diciamo che non hai pescato tra gli esempi più facili...

  4. #4
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    ciao
    ammetto di aver provato, all'inizio, a compilare solo il file che mi interessava, poi ho visto il disastro e allora mi sono messo a ricreare l'albero
    questo è quello che ho ottenuto
    codice:
    Folder PATH listing
    Volume serial number is 6415-D6A3
    C:.
    +---book
    |   +---lib
    |   +---resources
    |   |   +---calendar
    |   |   +---db
    |   |   +---encryption
    |   |   +---fonts
    |   |   +---img
    |   |   +---js
    |   |   +---jsp
    |   |   +---pdfs
    |   |   +---posters
    |   |   +---scripts
    |   |   +---swf
    |   |   +---txt
    |   |   \---xml
    |   +---results
    |   |   +---part1
    |   |   |   +---chapter01
    |   |   |   +---chapter02
    |   |   |   +---chapter03
    |   |   |   +---chapter04
    |   |   |   \---chapter05
    |   |   +---part2
    |   |   |   +---chapter06
    |   |   |   +---chapter07
    |   |   |   \---chapter08
    |   |   +---part3
    |   |   |   +---chapter09
    |   |   |   +---chapter10
    |   |   |   +---chapter11
    |   |   |   \---chapter12
    |   |   \---part4
    |   |       +---chapter13
    |   |       +---chapter14
    |   |       +---chapter15
    |   |       \---chapter16
    |   +---src
    |   |   +---com
    |   |   |   \---lowagie
    |   |   |       +---database
    |   |   |       \---filmfestival
    |   |   +---part1
    |   |   |   +---chapter01
    |   |   |   +---chapter02
    |   |   |   +---chapter03
    |   |   |   +---chapter04
    |   |   |   \---chapter05
    |   |   +---part2
    |   |   |   +---chapter06
    |   |   |   +---chapter07
    |   |   |   \---chapter08
    |   |   +---part3
    |   |   |   +---chapter09
    |   |   |   +---chapter10
    |   |   |   +---chapter11
    |   |   |   \---chapter12
    |   |   \---part4
    |   |       +---chapter13
    |   |       +---chapter14
    |   |       +---chapter15
    |   |       \---chapter16
    |   \---WebContent
    |       \---WEB-INF
    +---com
    |   +---itextpdf
    |   |   +---awt
    |   |   |   \---geom
    |   |   |       +---gl
    |   |   |       \---misc
    |   |   \---text
    |   |       +---api
    |   |       +---error_messages
    |   |       +---exceptions
    |   |       +---factories
    |   |       +---html
    |   |       |   \---simpleparser
    |   |       +---l10n
    |   |       |   \---error
    |   |       +---log
    |   |       +---pdf
    |   |       |   +---codec
    |   |       |   |   \---wmf
    |   |       |   +---collection
    |   |       |   +---crypto
    |   |       |   +---draw
    |   |       |   +---events
    |   |       |   +---fonts
    |   |       |   |   \---cmaps
    |   |       |   +---hyphenation
    |   |       |   |   \---hyph
    |   |       |   +---interfaces
    |   |       |   +---internal
    |   |       |   +---parser
    |   |       |   \---qrcode
    |   |       \---xml
    |   |           +---simpleparser
    |   |           |   \---handler
    |   |           \---xmp
    |   \---lowagie
    |       +---database
    |       \---filmfestival
    +---part1
    |   +---chapter01
    |   +---chapter02
    |   +---chapter03
    |   +---chapter04
    |   \---chapter05
    +---part2
    |   +---chapter06
    |   +---chapter07
    |   \---chapter08
    +---part3
    |   +---chapter09
    |   +---chapter10
    |   +---chapter11
    |   \---chapter12
    \---part4
        +---chapter13
        +---chapter14
        +---chapter15
        \---chapter16
    come puoi vedere dalla radice dell'albero, il file InspectPageContent viene compilato, ma quando provo ad eseguirlo con
    codice:
    java InspectPageContent
    mi vengono gli errori di cui al secondo post
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  5. #5
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    comunque mi sembra di capire da questo
    Originariamente inviato da watermark
    ...
    Per rispondere anche al tuo primo post, non è facile come sembra implementare ciò che vuoi per un semplice motivo: i file pdf in genere non hanno un "marker" che avvisa quando sta per arrivare una tabella... per questo motivo iText e altri (un altro degno di nota a mio parere è PDFBox) non sono impeccabili, ma devi trovare tu un metodo per fare il parsing di ciò che ti interessa...
    ...
    che praticamente ciò che cerco non è fattibile
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    Beh non ti volevo "smontare", tra l'altro io non ho mai affrontato un problema simile quindi tra le API di iText potrebbe anche esserci qualcosa che fa per te... Cerca un po' su Google...
    In merito all'eccezione che hai postato, come avrai già notato c'è qualche problema con la classe InspectPageContent e in genere questo tipo di eccezioni si riferiscono a problemi di classpath... Anche se l'alberatura riporta tutte le cartelle part*/chapter*, controlla meglio quest'aspetto.
    In ogni caso, come detto ieri, penso che tu debba fare il restore di filmfestival.script (e includere hsqldb.jar) perché la classe MovieTemplates effettua delle operazioni su un database HSQLDB. Se ti stai affacciando ora ad iText, fossi in te sceglierei delle prove un po' più semplici per leggere il contenuto di un pdf.

  7. #7
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    OK allora abbandono quella classe e cerco qualcosa che faccia più per me
    prima di addentrarmi negli esempi mi ero creato questa classe per analizzare i pdf

    codice:
    import java.io.*;
    
    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    import java.util.*;
    
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.PRTokeniser;
    import com.itextpdf.text.pdf.PdfContentByte;
    import com.itextpdf.text.pdf.PdfCopy;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfWriter;
    import com.itextpdf.text.pdf.RandomAccessFileOrArray;
    
    public class SplitPDFDebug{
    	public static void main(String [] args){
    		try{
    			split(args[0]);
    		}catch(Exception e){
    			System.out.println(e);
    		}
    	}
    	
        public static void split(String fileOriginale) throws Exception{
            /*System.err.println("argc : " + args.length);
            System.err.println("arg0 : " + args[0]);*/
    		String key="";
    		String val="";
    		String modello="";
    		int j=1;
    		Document document;
    		PdfCopy copy;
            
    		PdfReader reader = new PdfReader(fileOriginale);
            int pages = reader.getNumberOfPages();
    		
    		System.out.println(fileOriginale);
    				
            for (int i = 1; i <= pages; i+=2) {
                byte[] streamBytes = reader.getPageContent(i);
                //String contentStream = new String(streamBytes);
                PRTokeniser tokenizer = new PRTokeniser(streamBytes);
                boolean found = false;
    			System.out.println("\tPagina "+ i +" INIZIO");			
    			j=1;
                while (tokenizer.nextToken()) {
    				if (tokenizer.getTokenType() == PRTokeniser.TokenType.STRING) {
    					System.out.print("\t\t"+j+"\t\t\t");
    					System.out.print(tokenizer.getStringValue());
    					System.out.print("\n");
                    }
    				j++;
                }
    			System.out.println("\tPagina "+ i +" FINE");
            }
        }
    }
    come vedi se il token è di tipo stringa lo stampo. a questo punto potrei controllare se c'è un particolare tipo di token. mi chiedo se c'è qualcuna delle costanti di questa classe possa fare al caso mio
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.