Grupos de Google ya no admite nuevas publicaciones ni suscripciones de Usenet. El contenido anterior sigue siendo visible.

PDFBox: PDF nach Bild

Visto 170 veces
Saltar al primer mensaje no leído

Chris Seidel

no leída,
4 ene 2011, 9:10:524/1/11
a
Hallo,

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

Chris Seidel

no leída,
4 ene 2011, 16:02:394/1/11
a
On Tue, 04 Jan 2011 15:10:52 +0100, Chris Seidel <cr_s...@arcor.de>
wrote:

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;
/* */ }

Florian Hopf

no leída,
5 ene 2011, 8:52:465/1/11
a
Hi,

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

Chris Seidel

no leída,
5 ene 2011, 9:24:195/1/11
a
On Wed, 05 Jan 2011 14:52:46 +0100, Florian Hopf <wit...@gmx.de> wrote:

> 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?

Chris Seidel

no leída,
5 ene 2011, 10:20:375/1/11
a
On Wed, 05 Jan 2011 14:52:46 +0100, Florian Hopf <wit...@gmx.de> wrote:

> 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)

Chris Seidel

no leída,
5 ene 2011, 10:42:425/1/11
a
On Wed, 05 Jan 2011 16:20:37 +0100, Chris Seidel <cr_s...@arcor.de>
wrote:

> 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?

Florian Hopf

no leída,
5 ene 2011, 10:54:155/1/11
a
Chris Seidel schrieb:

> On Wed, 05 Jan 2011 14:52:46 +0100, Florian Hopf <wit...@gmx.de> wrote:
>
>> 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?
>

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.

Lothar Kimmeringer

no leída,
10 ene 2011, 13:38:3110/1/11
a
Chris Seidel wrote:

> 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!

Chris Seidel

no leída,
10 ene 2011, 15:14:3810/1/11
a
On Mon, 10 Jan 2011 19:38:31 +0100, Lothar Kimmeringer
<news2...@kimmeringer.de> wrote:

> 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.

Lothar Kimmeringer

no leída,
10 ene 2011, 17:00:4510/1/11
a
Chris Seidel wrote:

>> 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.

Chris Seidel

no leída,
11 ene 2011, 3:54:2611/1/11
a
On Mon, 10 Jan 2011 23:00:45 +0100, Lothar Kimmeringer
<news2...@kimmeringer.de> wrote:

> 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?

Lothar Kimmeringer

no leída,
12 ene 2011, 17:29:2712/1/11
a
0 mensajes nuevos