You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Andreas Lehmkühler (JIRA)" <ji...@apache.org> on 2017/11/03 17:13:01 UTC
[jira] [Resolved] (PDFBOX-3990) Rendering will never complete
[ https://issues.apache.org/jira/browse/PDFBOX-3990?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andreas Lehmkühler resolved PDFBOX-3990.
----------------------------------------
Resolution: Fixed
I can't confirm an endless loop. It works on my machine, but it is very slow. After adding the conditional breakpoint as suggested, everything is way much faster.
Thanks [~barsk] for your finding and the fix!
> Rendering will never complete
> -----------------------------
>
> Key: PDFBOX-3990
> URL: https://issues.apache.org/jira/browse/PDFBOX-3990
> Project: PDFBox
> Issue Type: Bug
> Components: Rendering
> Affects Versions: 2.0.8
> Environment: Java 1.8
> Reporter: Kristian Jörg
> Assignee: Andreas Lehmkühler
> Priority: Critical
> Fix For: 2.0.9
>
> Attachments: D90296482_20171102.PDF
>
>
> I have a PDF file that I am attempting to render with:
> {code:java}
> PDFRenderer renderer = new PDFRenderer(document);
> for (int i = 0; i < 2; i++ ) { // the document is two pages, code simplified
> BufferedImage image = renderer.renderImageWithDPI(i, dpi, ImageType.RGB);
> }
> {code}
> However, the code never returns. When I pause execution (in Eclipse) I see that execution never leaves the decode() method of org.apache.pdfbox.filter.RunLengthDecodeFilter.
> The problem is that the inner loop of while (amountToCopy > 0) in bold below is never executed because the stream has come to EOF! That means that the int compressedRead get a negative value and amountToCopy is _*added *_to instead of being subtracted from.
> The loop seems to eventually step out of itself, Probably when the integer warps around when reaching it's max (?)
> The problem is easy to catch if setting a conditional breakpoint on compressedRead == -1.
> I'll include the PDF. The problem arises on page 2.
> {code:java}
> public DecodeResult decode(InputStream encoded, OutputStream decoded,
> COSDictionary parameters, int index) throws IOException
> {
> int dupAmount;
> byte[] buffer = new byte[128];
> while ((dupAmount = encoded.read()) != -1 && dupAmount != RUN_LENGTH_EOD)
> {
> if (dupAmount <= 127)
> {
> int amountToCopy = dupAmount + 1;
> int compressedRead;
> * while(amountToCopy > 0)
> {
> compressedRead = encoded.read(buffer, 0, amountToCopy);
> decoded.write(buffer, 0, compressedRead);
> amountToCopy -= compressedRead;
> }*
> }
> else
> {
> int dupByte = encoded.read();
> for (int i = 0; i < 257 - dupAmount; i++)
> {
> decoded.write(dupByte);
> }
> }
> }
> return new DecodeResult(parameters);
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org