Hallo zusammen,
ich muss aus nem PDF alle Images extrahieren und nutze dazu PDFBox, dass dazu laut Specs ja eigentlich auch in der Lage sein sollte.
Ich erhalte allerdings immer die folgende Exception:
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:216)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:134)
at org.pdfbox.filter.FlateFilter.decode(FlateFilter.java:110)
at org.pdfbox.cos.COSStream.doDecode(COSStream.java:290)
at org.pdfbox.cos.COSStream.doDecode(COSStream.java:235)
at org.pdfbox.cos.COSStream.getUnfilteredStream(COSStream.java:170)
at org.pdfbox.pdmodel.common.PDStream.createInputStream(PDStream.java:226)
at org.pdfbox.pdmodel.common.PDStream.getByteArray(PDStream.java:481)
at org.pdfbox.pdmodel.graphics.xobject.PDPixelMap.getRGBImage(PDPixelMap.java:138)
at org.pdfbox.pdmodel.graphics.xobject.PDPixelMap.write2OutputStream(PDPixelMap.java:166)
at org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage.write2file(PDXObjectImage.java:118)
at publications.eu.utils.ExtractPdfImages.extractImages(ExtractPdfImages.java:106)
at publications.eu.podl.validators.PdfTiffSampler.doJob(PdfTiffSampler.java:140)
at publications.eu.podl.validators.PdfTiffSamplerTest.testDoJob(PdfTiffSamplerTest.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Hier mal der dazugehörige Code:
Hat jmd. zufällig ne Idee, was da schief läuft?
Momentan schafft es das Programm zumindest schon mal jedes TIFF zu extrahieren. Einige der Images innerhalb des PDFs sind in Farbe und genau die sind es, die Probleme verurschen und die Exception auslösen. Komischerweise hab ich sogar die dazugehörigen Dateien für die farbigen Images im temp folder. Diese haben allerdings eine Dateigröße von 0 Bytes.
Bin für jede Hilfe echt sehr dankbar!
Ich werd hier noch wahnsinnig!
Viele Grüße,
Masipulami [/code]
ich muss aus nem PDF alle Images extrahieren und nutze dazu PDFBox, dass dazu laut Specs ja eigentlich auch in der Lage sein sollte.
Ich erhalte allerdings immer die folgende Exception:
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:216)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:134)
at org.pdfbox.filter.FlateFilter.decode(FlateFilter.java:110)
at org.pdfbox.cos.COSStream.doDecode(COSStream.java:290)
at org.pdfbox.cos.COSStream.doDecode(COSStream.java:235)
at org.pdfbox.cos.COSStream.getUnfilteredStream(COSStream.java:170)
at org.pdfbox.pdmodel.common.PDStream.createInputStream(PDStream.java:226)
at org.pdfbox.pdmodel.common.PDStream.getByteArray(PDStream.java:481)
at org.pdfbox.pdmodel.graphics.xobject.PDPixelMap.getRGBImage(PDPixelMap.java:138)
at org.pdfbox.pdmodel.graphics.xobject.PDPixelMap.write2OutputStream(PDPixelMap.java:166)
at org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage.write2file(PDXObjectImage.java:118)
at publications.eu.utils.ExtractPdfImages.extractImages(ExtractPdfImages.java:106)
at publications.eu.podl.validators.PdfTiffSampler.doJob(PdfTiffSampler.java:140)
at publications.eu.podl.validators.PdfTiffSamplerTest.testDoJob(PdfTiffSamplerTest.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Hier mal der dazugehörige Code:
Code:
public static Vector<File> extractImages(String pdfFile, String outputPath) throws Exception{
PDDocument document = null;
Vector<File> extracted = new Vector<File>();
try {
document = PDDocument.load(pdfFile);
List pages = document.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
while (iter.hasNext()) {
PDPage page = (PDPage) iter.next();
PDResources resources = page.getResources();
Map images = resources.getImages();
if (images != null) {
Iterator imageIter = images.keySet().iterator();
while (imageIter.hasNext()) {
String key = (String) imageIter.next();
PDXObjectImage image = (PDXObjectImage) images.get(key);
String name = getUniqueFileName(key, image.getSuffix());
logger.info("Writing image: " + name + " to "
+ outputPath);
File out = new File(outputPath, name);
try {
image.write2file(out
.getAbsolutePath());
extracted.add(out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
} finally {
if (document != null) {
document.close();
}
}
return extracted;
}
private static String getUniqueFileName(String prefix, String suffix) {
String uniqueName = null;
File f = null;
while (f == null || f.exists()) {
uniqueName = prefix + "-" + imageCounter;
f = new File(uniqueName + "." + suffix);
imageCounter++;
}
return uniqueName;
}
Hat jmd. zufällig ne Idee, was da schief läuft?
Momentan schafft es das Programm zumindest schon mal jedes TIFF zu extrahieren. Einige der Images innerhalb des PDFs sind in Farbe und genau die sind es, die Probleme verurschen und die Exception auslösen. Komischerweise hab ich sogar die dazugehörigen Dateien für die farbigen Images im temp folder. Diese haben allerdings eine Dateigröße von 0 Bytes.
Bin für jede Hilfe echt sehr dankbar!
Ich werd hier noch wahnsinnig!
Viele Grüße,
Masipulami [/code]