PDF durchsuchen nach Schlüsselwort mit PDFBox

karl_h

Grünschnabel
Hallo!

Ich habe ein kleines Problem, ich benutze folgenden Code, um ein PDF einzulesen und dieses seitenweise nach dem Tag <Seitenumbruch> zu durchsuchen.

Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


import java.util.List;

import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDPage;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.util.PDFTextStripper;
import org.pdfbox.util.Splitter;
import org.pdfbox.pdfwriter.COSWriter;

import java.io.InputStream;
import java.io.FileOutputStream;

import org.pdfbox.exceptions.InvalidPasswordException;
import org.pdfbox.exceptions.COSVisitorException;





public class test {


	 	public static void main(String args[])
	 	{
	 		List documents = null;
	 		Splitter splitter = new Splitter();
	 		PDFParser parser;
	 		try {
	 			PDFTextStripper stripper = new PDFTextStripper();
	 			parser = new PDFParser(new FileInputStream(new File(
					"c:/Test.pdf" )));
	 			parser.parse();
	 			PDDocument doc = parser.getPDDocument();
	 			System.out.println("Gesamtanzahl an Seiten: "+doc.getNumberOfPages()); 	
	 			splitter.setSplitAtPage(1);
	 			documents = splitter.split(doc);
	 			System.out.println("Aufgeteilt in "+documents.size()+" Teile.");
	 			
	 			for (int i = 0; i < documents.size(); i++)
	 			{
	 				
	 				PDDocument doc2 = (PDDocument) documents.get(i);
	 				String textContent = stripper.getText(doc2);
	 				if(textContent.indexOf("<Seitenumbruch>")!=-1)
	 					{
	 					System.out.println("Ein Zeilenumbruch befindet sich auf Seite "+(i+1));
	 					}
            }
	
			} catch (FileNotFoundException e){
				System.out.println("File not found!");
			} catch (IOException e) {
				System.out.println("Error!");
			} 
	 	}
	 }

Das funktioniert soweit bestens, nur wenn das Dokument zu groß (mehr als 13 Seiten) ist, bricht es ab.

Als Fehler bekomme ich folgendes angezeigt:

Gesamtanzahl an Seiten: 28
Aufgeteilt in 28 Teile.
Ein Zeilenumbruch befindet sich auf Seite 4
Ein Zeilenumbruch befindet sich auf Seite 8
Ein Zeilenumbruch befindet sich auf Seite 13
Exception in thread "main" java.lang.NoClassDefFoundError: org/fontbox/afm/FontMetric
at org.pdfbox.pdmodel.font.PDFont.getAFM(PDFont.java:334)
at org.pdfbox.pdmodel.font.PDSimpleFont.getFontHeight(PDSimpleFont.java:104)
at org.pdfbox.util.PDFStreamEngine.showString(PDFStreamEngine.java:336)
at org.pdfbox.util.operator.ShowTextGlyph.process(ShowTextGlyph.java:80)
at org.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:452)
at org.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:215)
at org.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:174)
at org.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:336)
at org.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:259)
at org.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:216)
at org.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:149)
at de.datax.ag.pdf.splitter.test.main(test.java:51)
Caused by: java.lang.ClassNotFoundException: org.fontbox.afm.FontMetric
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 java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 12 more

Hat jemand eine Idee woran das liegen könnte? Stöß die "List" an die Grenze (Größe)?

Vielen Dank schonmal.

Viele Grüße
karl_h
 
Hallo,
laut Errorlog fehlt anscheinend eine Library.

Im PDFBox -Ordner ../external liegt eine "FontBox..jar", die muss mit in den BuildPath.
Dann sollte es funktionieren.

Grüße,
Peter
 
Also diese Exception bedeutet, dass er die Klasse "org.fontbox.afm.FontMetric" nicht im Klassenpfad finden konnte.

Hat PDFBox irgendwelche abhängigkeiten zu anderen Libraries od. hast du nicht alle JARs im Klassenpfad?
 
Hallo!

Vielen Dank für die flotte Hilfe. Inzwischen haben ich die Libs für fontbox hinzugefügt. Ich bin jedoch etwas irritiert, dass es ohne fontbox-Lib mit wenigen Seiten klappt, hat aber mit vielen nicht?

Grüße
karl_h
 
Keine Ahnung wozu die Fontbox genau verwendet wird, ich könnte mir vorstellen, dass sie zur Unterstützung von speziellen Schriftarten herangezogen wird.

Je nachdem ob jetzt im PDF diese "speziellen" Schriftarten verwendet werden, wird die Library angesprochen od. nicht.
 
Zurück