[
https://issues.apache.org/jira/browse/PDFBOX-3689?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ryan Kimber updated PDFBOX-3689:
--------------------------------
Description:
I'm trying to render the attached file in a Docker container, using the
oracle-java-8 image, rendering pages with {{PDFRenderer.renderImageWithDPI}} is
hanging indefinitely (or at least, for a very long time).
I'm experiencing the same symptoms as PDFBOX-3562, where the call to
renderImageWithDPI never returns, and likewise, I'm using the java startup
parameter: {{-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider}}.
We are executing the renderImageWithDPI asynchronously using Callables and a
newWorkStealingPool Executor, with a thread count equal to the number of
processors + 1.
Interestingly, when this code and this PDF run in the debugger on my Mac,
there's no problem.
This is the code, which runs fine when only one thread is created. Note that
our code is called when a message is received, but this could easily be a main
method instead:
{code:java}
public class NewPdfTemplateQueueWorker
{
private ExecutorService executor = Executors.newWorkStealingPool(threadCt);
private Scheduler scheduler = Schedulers.from(executor);
@Override
public void processRequest(BuildResourceRequest serviceRequest) throws
PdfServiceException
{
//We're going to expect just one action.
GenerateImagesAndMetaDataStep buildStep =
(GenerateImagesAndMetaDataStep) serviceRequest.getBuildSteps().get(0);
buildStep.setRequestId(serviceRequest.getRequestId());
buildStep.setSessionId(serviceRequest.getSessionId());
long stopwatch = System.currentTimeMillis();
try {
byte[] pdfBytes = buildStep.getPdfBytes();
PdfInfo pdfInfo = PdfMetaDataFactory.buildPdfInfo(pdfBytes);
log.warn("it took until " + (System.currentTimeMillis() -
stopwatch) + "ms to build the pdf info");
//Generate and publish each page image and thumbnails...
ArrayList<Callable<Throwable>> callList = new
ArrayList<Callable<Throwable>>();
callList.add(new CallablePdfInfoPersister(serviceRequest,
buildStep, pdfInfo));
PageImageFactory imageFactory = new PageImageFactory(pdfBytes);
for(int i = 0; i < pdfInfo.getNumberOfPages(); i++)
{
log.info("Adding callablePageImageGenerator for page #"+ (i +
1) + "...");
callList.add(new CallablePageImageGenerator(buildStep,
imageFactory, i));
}
boolean allSucceeded = true;
Throwable firstError = null;
List<Future<Throwable>> results = executor.invokeAll(callList);
for(Future<Throwable> result : results) {
if(result.get() != null) {
allSucceeded = false;
firstError = result.get();
break;
}
}
if(allSucceeded) log.warn("We have created the page images and PDF
Info and written them to Google Storage");
else throw new PdfServiceException("Error generating at least one
page image", firstError);
}
catch(PdfServiceException pdfse)
{
log.error("PDFServiceException while processing request:", pdfse);
tryToRespondWithError(serviceRequest, pdfse);
}
catch(IOException | InterruptedException | ExecutionException fce) {
log.error(fce.getClass().getName() + " while processing request:",
fce);
throw new PdfServiceException("Unable to process new PDF template
due to exception:", fce);
}
finally {
stopwatch = System.currentTimeMillis() - stopwatch;
log.warn("It took " + stopwatch + "ms to convert the PDF to data
and images...");
}
}
}
public class CallablePageImageGenerator implements Callable<Throwable>
{
private static final Logger log =
LogManager.getLogger(CallablePageImageGenerator.class.getName());
private GenerateImagesAndMetaDataStep buildStep;
private PageImageFactory pageImageFactory;
private int pageIndex;
public CallablePageImageGenerator(GenerateImagesAndMetaDataStep buildStep,
PageImageFactory pageImageFactory, int pageIndex)
{
super();
this.buildStep = buildStep;
this.pageImageFactory = pageImageFactory;
this.pageIndex = pageIndex;
}
public Throwable call() {
try {
long pageTime = System.currentTimeMillis();
//This pageImageFactory.convertToPageImage function calls
pdfRenderer.renderImageWithDPI(pdPage, 150)...
PageImage pageImage =
pageImageFactory.convertPageToImage(pageIndex, 150);
log.warn("Page " + (pageIndex + 1) + " Images took " +
(System.currentTimeMillis() - pageTime) + "ms to generate...");
//publisher.publishMessage(RESPONSE_QUEUE, new
PageImageResult("pageImageResult", serviceRequest.getRequestId(),
serviceRequest.getSessionId(), pageImage));
//Write to Google Cloud Storage, but don't bother writing anywhere
else
//CachingGoogleCloudStorageUtil.putPageImage(buildStep.getBucket(),
buildStep.getFileFolder(), pageImage);
log.warn("Page " + (pageIndex + 1) + " complete in " +
(System.currentTimeMillis() - pageTime) + "ms");
return null;
}
catch(IOException ioe)
{
log.error("IOException generating images for page " + (pageIndex +
1), ioe);
return ioe;
}
}
}
{code}
was:
I'm trying to render the attached file in a Docker container, using the
oracle-java-8 image, rendering pages with {{PDFRenderer.renderImageWithDPI}} is
hanging indefinitely (or at least, for a very long time).
I'm experiencing the same issue as PDFBOX-3562, and likewise, I'm using the
java startup parameter:
{{-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider}}.
Interestingly, when this code and this PDF run in the debugger on my Mac,
there's no problem.
This is the call that hangs:
{code:java}
private BufferedImage getBufferedImageOfPage(int pageIndex, int dpi,
PDFRenderer imageRenderer) throws IOException
{
if(dpi > 600) dpi = 600;
if(dpi < 36) dpi = 36;
return imageRenderer.renderImageWithDPI(pageIndex, dpi);
}
{code}
> PDFBox Hanging when Rendering PDF
> ---------------------------------
>
> Key: PDFBOX-3689
> URL: https://issues.apache.org/jira/browse/PDFBOX-3689
> Project: PDFBox
> Issue Type: Bug
> Affects Versions: 2.0.4
> Reporter: Ryan Kimber
> Attachments: troubled-pdf.pdf
>
>
> I'm trying to render the attached file in a Docker container, using the
> oracle-java-8 image, rendering pages with {{PDFRenderer.renderImageWithDPI}}
> is hanging indefinitely (or at least, for a very long time).
> I'm experiencing the same symptoms as PDFBOX-3562, where the call to
> renderImageWithDPI never returns, and likewise, I'm using the java startup
> parameter: {{-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider}}.
> We are executing the renderImageWithDPI asynchronously using Callables and a
> newWorkStealingPool Executor, with a thread count equal to the number of
> processors + 1.
> Interestingly, when this code and this PDF run in the debugger on my Mac,
> there's no problem.
> This is the code, which runs fine when only one thread is created. Note that
> our code is called when a message is received, but this could easily be a
> main method instead:
> {code:java}
> public class NewPdfTemplateQueueWorker
> {
> private ExecutorService executor =
> Executors.newWorkStealingPool(threadCt);
> private Scheduler scheduler = Schedulers.from(executor);
> @Override
> public void processRequest(BuildResourceRequest serviceRequest) throws
> PdfServiceException
> {
> //We're going to expect just one action.
> GenerateImagesAndMetaDataStep buildStep =
> (GenerateImagesAndMetaDataStep) serviceRequest.getBuildSteps().get(0);
> buildStep.setRequestId(serviceRequest.getRequestId());
> buildStep.setSessionId(serviceRequest.getSessionId());
> long stopwatch = System.currentTimeMillis();
> try {
> byte[] pdfBytes = buildStep.getPdfBytes();
> PdfInfo pdfInfo = PdfMetaDataFactory.buildPdfInfo(pdfBytes);
> log.warn("it took until " + (System.currentTimeMillis() -
> stopwatch) + "ms to build the pdf info");
> //Generate and publish each page image and thumbnails...
> ArrayList<Callable<Throwable>> callList = new
> ArrayList<Callable<Throwable>>();
> callList.add(new CallablePdfInfoPersister(serviceRequest,
> buildStep, pdfInfo));
> PageImageFactory imageFactory = new PageImageFactory(pdfBytes);
> for(int i = 0; i < pdfInfo.getNumberOfPages(); i++)
> {
> log.info("Adding callablePageImageGenerator for page #"+ (i +
> 1) + "...");
> callList.add(new CallablePageImageGenerator(buildStep,
> imageFactory, i));
> }
> boolean allSucceeded = true;
> Throwable firstError = null;
> List<Future<Throwable>> results = executor.invokeAll(callList);
> for(Future<Throwable> result : results) {
> if(result.get() != null) {
> allSucceeded = false;
> firstError = result.get();
> break;
> }
> }
> if(allSucceeded) log.warn("We have created the page images and
> PDF Info and written them to Google Storage");
> else throw new PdfServiceException("Error generating at least one
> page image", firstError);
> }
> catch(PdfServiceException pdfse)
> {
> log.error("PDFServiceException while processing request:", pdfse);
> tryToRespondWithError(serviceRequest, pdfse);
> }
> catch(IOException | InterruptedException | ExecutionException fce) {
> log.error(fce.getClass().getName() + " while processing
> request:", fce);
> throw new PdfServiceException("Unable to process new PDF template
> due to exception:", fce);
> }
> finally {
> stopwatch = System.currentTimeMillis() - stopwatch;
> log.warn("It took " + stopwatch + "ms to convert the PDF to data
> and images...");
> }
> }
> }
> public class CallablePageImageGenerator implements Callable<Throwable>
> {
> private static final Logger log =
> LogManager.getLogger(CallablePageImageGenerator.class.getName());
> private GenerateImagesAndMetaDataStep buildStep;
> private PageImageFactory pageImageFactory;
> private int pageIndex;
> public CallablePageImageGenerator(GenerateImagesAndMetaDataStep
> buildStep, PageImageFactory pageImageFactory, int pageIndex)
> {
> super();
> this.buildStep = buildStep;
> this.pageImageFactory = pageImageFactory;
> this.pageIndex = pageIndex;
> }
> public Throwable call() {
> try {
> long pageTime = System.currentTimeMillis();
> //This pageImageFactory.convertToPageImage function calls
> pdfRenderer.renderImageWithDPI(pdPage, 150)...
> PageImage pageImage =
> pageImageFactory.convertPageToImage(pageIndex, 150);
> log.warn("Page " + (pageIndex + 1) + " Images took " +
> (System.currentTimeMillis() - pageTime) + "ms to generate...");
> //publisher.publishMessage(RESPONSE_QUEUE, new
> PageImageResult("pageImageResult", serviceRequest.getRequestId(),
> serviceRequest.getSessionId(), pageImage));
> //Write to Google Cloud Storage, but don't bother writing
> anywhere else
>
> //CachingGoogleCloudStorageUtil.putPageImage(buildStep.getBucket(),
> buildStep.getFileFolder(), pageImage);
> log.warn("Page " + (pageIndex + 1) + " complete in " +
> (System.currentTimeMillis() - pageTime) + "ms");
> return null;
> }
> catch(IOException ioe)
> {
> log.error("IOException generating images for page " + (pageIndex
> + 1), ioe);
> return ioe;
> }
> }
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]