ich konvertiere mit PDFBox PDFs in Bilder (png) um. Haben die PDFs viele
Seiten, gibts eine OOME :/
PDDocument doc = PDDocument.load(new File("big.pdf"));
PDDocumentCatalog catalog = doc.getDocumentCatalog();
List pages = catalog.getAllPages();
for(Object o : pages){
PDPage page = (PDPage)o;
BufferedImage image = page.convertToImage();//<= OOME
ImageIO.write(image, "png", file);
}
Kann ich da was optimieren was den Speicher angeht oder ist das ein nicht
umschiffbarer Bug in PDFBox (Google hab ich nichts gefunden)?
java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41)
at java.awt.image.Raster.createPackedRaster(Raster.java:458)
at
java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
at java.awt.image.BufferedImage.<init>(BufferedImage.java:321)
at
sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:537)
at
sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:521)
at sun.java2d.loops.MaskBlit$General.MaskBlit(MaskBlit.java:171)
at sun.java2d.loops.Blit$GeneralMaskBlit.Blit(Blit.java:186)
at sun.java2d.pipe.DrawImage.blitSurfaceData(DrawImage.java:927)
at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:550)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:54)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:982)
at sun.java2d.pipe.ValidatePipe.copyImage(ValidatePipe.java:168)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2988)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2973)
at sun.java2d.pipe.DrawImage.makeBufferedImage(DrawImage.java:317)
at sun.java2d.pipe.DrawImage.renderImageXform(DrawImage.java:372)
at sun.java2d.pipe.DrawImage.transformImage(DrawImage.java:199)
at sun.java2d.pipe.DrawImage.transformImage(DrawImage.java:1053)
at sun.java2d.pipe.ValidatePipe.transformImage(ValidatePipe.java:212)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3110)
at org.apache.pdfbox.pdfviewer.PageDrawer.drawImage(PageDrawer.java:385)
at
org.apache.pdfbox.util.operator.pagedrawer.Invoke.process(Invoke.java:117)
at
org.apache.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:529)
at
org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:274)
at
org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:251)
at
org.apache.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:225)
at org.apache.pdfbox.pdfviewer.PageDrawer.drawPage(PageDrawer.java:107)
at org.apache.pdfbox.pdmodel.PDPage.convertToImage(PDPage.java:722)
at org.apache.pdfbox.pdmodel.PDPage.convertToImage(PDPage.java:693)
Danke
Hier noch der Code aus PDFBox:
/* */ public BufferedImage convertToImage(int imageType, int
resolution)
/* */ throws IOException
/* */ {
/* 707 */ PDRectangle mBox = findMediaBox();
/* 708 */ float widthPt = mBox.getWidth();
/* 709 */ float heightPt = mBox.getHeight();
/* 710 */ float scaling = resolution / 72.0F;
/* 711 */ int widthPx = Math.round(widthPt * scaling);
/* 712 */ int heightPx = Math.round(heightPt * scaling);
/* */
/* 714 */ Dimension pageDimension = new Dimension((int)widthPt,
(int)heightPt);
/* */
/* 716 */ BufferedImage retval = new BufferedImage(widthPx, heightPx,
imageType);
/* 717 */ Graphics2D graphics = (Graphics2D)retval.getGraphics();
/* 718 */ graphics.setBackground(TRANSPARENT_WHITE);
/* 719 */ graphics.clearRect(0, 0, retval.getWidth(),
retval.getHeight());
/* 720 */ graphics.scale(scaling, scaling);
/* 721 */ PageDrawer drawer = new PageDrawer();
/* 722 */ drawer.drawPage(graphics, this, pageDimension);
/* */ try
/* */ {
/* 728 */ int rotation = findRotation();
/* 729 */ if ((rotation == 90) || (rotation == 270))
/* */ {
/* 731 */ int w = retval.getWidth();
/* 732 */ int h = retval.getHeight();
/* 733 */ BufferedImage rotatedImg = new BufferedImage(w, h,
retval.getType());
/* 734 */ Graphics2D g = rotatedImg.createGraphics();
/* 735 */ g.rotate(Math.toRadians(rotation), w / 2, h / 2);
/* 736 */ g.drawImage(retval, null, 0, 0);
/* */ }
/* */ }
/* */ catch (ImagingOpException e)
/* */ {
/* 741 */ log.warn("Unable to rotate page image", e);
/* */ }
/* */
/* 744 */ return retval;
/* */ }
Chris Seidel schrieb:
> ich konvertiere mit PDFBox PDFs in Bilder (png) um. Haben die PDFs viele
> Seiten, gibts eine OOME :/
>
>
> PDDocument doc = PDDocument.load(new File("big.pdf"));
> PDDocumentCatalog catalog = doc.getDocumentCatalog();
> List pages = catalog.getAllPages();
> for(Object o : pages){
> PDPage page = (PDPage)o;
> BufferedImage image = page.convertToImage();//<= OOME
> ImageIO.write(image, "png", file);
> }
>
>
> Kann ich da was optimieren was den Speicher angeht oder ist das ein
> nicht umschiffbarer Bug in PDFBox (Google hab ich nichts gefunden)?
>
Eine Lösung dazu kann ich nicht wirklich anbieten, ich hatte etwas
Ähnliches allerdings auch mal mit PDFBox versucht (Thumbnail aus einem
PDF). Damit waren die Resultate ziemlich schlecht, ich bin dann
umgeschwenkt auf PDFRenderer unter https://pdf-renderer.dev.java.net/
Damit hat das wunderbar funktioniert.
Gruß
Flo
> Eine Lösung dazu kann ich nicht wirklich anbieten, ich hatte etwas
> Ähnliches allerdings auch mal mit PDFBox versucht (Thumbnail aus einem
> PDF). Damit waren die Resultate ziemlich schlecht,
Inwiefern schlecht?
> ich bin dann umgeschwenkt auf PDFRenderer unter
> https://pdf-renderer.dev.java.net/
Was ist hier besser?
Kann der auch mit großen PDF?
> https://pdf-renderer.dev.java.net/
Der mag das PDF gar nicht... kommt wohl irgendwie mit den Tiffs drin nicht
klar.
java.lang.RuntimeException: Invalid code encountered.
at
com.sun.pdfview.decode.CCITTFaxDecoder.decodeNextScanline(CCITTFaxDecoder.java:703)
at
com.sun.pdfview.decode.CCITTFaxDecoder.decodeT41D(CCITTFaxDecoder.java:820)
at com.sun.pdfview.decode.CCITTFaxDecode.decode(CCITTFaxDecode.java:51)
at com.sun.pdfview.decode.CCITTFaxDecode.decode(CCITTFaxDecode.java:17)
at com.sun.pdfview.decode.PDFDecoder.decodeStream(PDFDecoder.java:103)
at com.sun.pdfview.PDFObject.decodeStream(PDFObject.java:331)
at com.sun.pdfview.PDFObject.getStream(PDFObject.java:263)
at com.sun.pdfview.PDFObject.getStream(PDFObject.java:257)
at com.sun.pdfview.PDFImage.getImage(PDFImage.java:225)
at com.sun.pdfview.PDFRenderer.drawImage(PDFRenderer.java:273)
at com.sun.pdfview.PDFImageCmd.execute(PDFPage.java:643)
at com.sun.pdfview.PDFRenderer.iterate(PDFRenderer.java:570)
at com.sun.pdfview.BaseWatchable.run(BaseWatchable.java:101)
at com.sun.pdfview.BaseWatchable.execute(BaseWatchable.java:263)
at com.sun.pdfview.BaseWatchable.go(BaseWatchable.java:197)
at com.sun.pdfview.PDFPage.getImage(PDFPage.java:228)
> On Wed, 05 Jan 2011 14:52:46 +0100, Florian Hopf <wit...@gmx.de> wrote:
Ups, das PDF war irgendwie kaputt. Nun bekomme ich auch hier den OOME:
java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41)
at java.awt.image.Raster.createPackedRaster(Raster.java:458)
at
java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
at java.awt.image.BufferedImage.<init>(BufferedImage.java:321)
at com.sun.pdfview.PDFRenderer.getMaskedImage(PDFRenderer.java:728)
at com.sun.pdfview.PDFRenderer.drawImage(PDFRenderer.java:275)
at com.sun.pdfview.PDFImageCmd.execute(PDFPage.java:643)
at com.sun.pdfview.PDFRenderer.iterate(PDFRenderer.java:570)
at com.sun.pdfview.BaseWatchable.run(BaseWatchable.java:101)
at com.sun.pdfview.BaseWatchable.execute(BaseWatchable.java:263)
at com.sun.pdfview.BaseWatchable.go(BaseWatchable.java:197)
at com.sun.pdfview.PDFPage.getImage(PDFPage.java:228)
Und siehe da - ein riesiges Bauplanbild mittendrin in den A4-Blättern...
Passt einfach nicht in den Heap und gut ist.
Da kann man dann wohl eher nix machen?
Die Qualitï¿œt der erzeugten Grafiken. Bei vielen Grafiken waren z.B.
schwarze Flï¿œchen ï¿œberlagert, von denen ich mir nicht erklï¿œren konnte wo
die herkamen. Eventuell kann man da noch tweaken, fï¿œr meinen Fall hat
pdfrenderer dann bestens funktioniert. Ich habe allerdings auch nur
Grafiken aus der ersten Seite generiert.
> Und siehe da - ein riesiges Bauplanbild mittendrin in den A4-Bl�ttern...
> Passt einfach nicht in den Heap und gut ist.
>
> Da kann man dann wohl eher nix machen?
Den Heap-Space erhoehen. Der ist standardmaessig bei 64MB, d.h.
bei einer Bitmap von 1728x2315 in ARGB hat man ja schon 16MB
verbraucht. Viel Platz nach oben ist da nicht mehr. Bei A2 hat
man schon die 64 geknackt. Bauplaene duerften darueber liegen.
Wenn ich der Exception in einem deiner vorigen Postings glauben
darf, liegen die Bilder als Modified Hoffman kodierte Datenstroeme
vor, d.h. hoechstwahrscheinlich in Schwarz weiss. Evtl. brauchst
du gar kein ARGB, sondern kannst Schwarz/Weiss-Bitmaps verwenden.
Gruesse, Lothar
--
Lothar Kimmeringer E-Mail: spam...@kimmeringer.de
PGP-encrypted mails preferred (Key-ID: 0x8BC3CD81)
Always remember: The answer is forty-two, there can only be wrong
questions!
> Den Heap-Space erhoehen. Der ist standardmaessig bei 64MB, d.h.
> bei einer Bitmap von 1728x2315 in ARGB hat man ja schon 16MB
> verbraucht. Viel Platz nach oben ist da nicht mehr. Bei A2 hat
> man schon die 64 geknackt. Bauplaene duerften darueber liegen.
Hatte die VM mal mit 800mb gestartet, reicht nicht.
> Wenn ich der Exception in einem deiner vorigen Postings glauben
> darf, liegen die Bilder als Modified Hoffman kodierte Datenstroeme
> vor, d.h. hoechstwahrscheinlich in Schwarz weiss. Evtl. brauchst
> du gar kein ARGB, sondern kannst Schwarz/Weiss-Bitmaps verwenden.
GRAY hab ich verwendet, weil bei SW die Vorschau grottig aussieht.
>> Wenn ich der Exception in einem deiner vorigen Postings glauben
>> darf, liegen die Bilder als Modified Hoffman kodierte Datenstroeme
>> vor, d.h. hoechstwahrscheinlich in Schwarz weiss. Evtl. brauchst
>> du gar kein ARGB, sondern kannst Schwarz/Weiss-Bitmaps verwenden.
>
> GRAY hab ich verwendet, weil bei SW die Vorschau grottig aussieht.
Vielleicht mit entsprechendem Dithering versuchen? Hat Hier[TM]
beim Umwandeln von PDF zu zu faxenden Faxdokumenten eigentlich
ganz gut funktioniert.
> Vielleicht mit entsprechendem Dithering versuchen? Hat Hier[TM]
> beim Umwandeln von PDF zu zu faxenden Faxdokumenten eigentlich
> ganz gut funktioniert.
Hast du mal ein Beispiel?