Google 網路論壇不再支援新的 Usenet 貼文或訂閱項目,但過往內容仍可供查看。

PDFBox: PDF nach Bild

瀏覽次數:170 次
跳到第一則未讀訊息

Chris Seidel

未讀,
2011年1月4日 上午9:10:522011/1/4
收件者:
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

未讀,
2011年1月4日 下午4:02:392011/1/4
收件者:
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

未讀,
2011年1月5日 上午8:52:462011/1/5
收件者:
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

未讀,
2011年1月5日 上午9:24:192011/1/5
收件者:
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

未讀,
2011年1月5日 上午10:20:372011/1/5
收件者:
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

未讀,
2011年1月5日 上午10:42:422011/1/5
收件者:
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

未讀,
2011年1月5日 上午10:54:152011/1/5
收件者:
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

未讀,
2011年1月10日 下午1:38:312011/1/10
收件者:
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

未讀,
2011年1月10日 下午3:14:382011/1/10
收件者:
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

未讀,
2011年1月10日 下午5:00:452011/1/10
收件者:
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

未讀,
2011年1月11日 凌晨3:54:262011/1/11
收件者:
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

未讀,
2011年1月12日 下午5:29:272011/1/12
收件者:
0 則新訊息