Itext HtmlConverter.convertToPdf is slow in converting the html to pdf

Viewed 633

I have a requirement to convert HTML to PDF in real time. For the same i'm using IText.

        PdfDocument inputDoc = new PdfDocument(new PdfWriter(byteArrayOutputStream))) {
      String html = "<html><head><Title> My pdf</Title></head></html>";
      inputDoc.addEventHandler(PdfDocumentEvent.START_PAGE, new PdfHeaderHandler(pageNumber,
          pageCount));
      inputDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new PdfFooterHandler(pageNumber,
          pageCount));

      HtmlConverter.convertToPdf(new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)), inputDoc,
          converterProperties);
      return new PdfDocument(
          new PdfReader(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())));
    } catch (IOException exception) {
      getLogger().error("Html to Pdf conversion failed for page {} of {} due to error {}", pageNumber, pageCount,
          exception.getMessage());
    } 

Now the problem is if the number pages are in the range of 30-50 and even if i'm converting each html page in parallel with 20 threads, i can see huge turnaround time, in range from 5-10 seconds per page.

One such example with 19 page and 20 threads, logs mentioned below:


2020-06-19 14:54:12.730 [PdfGenerationThreadPoolExecutor-12] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 3
2020-06-19 14:54:12.731 [PdfGenerationThreadPoolExecutor-5] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 2
2020-06-19 14:54:12.736 [PdfGenerationThreadPoolExecutor-6] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 4
2020-06-19 14:54:12.754 [PdfGenerationThreadPoolExecutor-19] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 5
2020-06-19 14:54:12.793 [PdfGenerationThreadPoolExecutor-15] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 7
2020-06-19 14:54:12.793 [PdfGenerationThreadPoolExecutor-10] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 6
2020-06-19 14:54:12.798 [PdfGenerationThreadPoolExecutor-14] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 9
2020-06-19 14:54:12.798 [PdfGenerationThreadPoolExecutor-16] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 8
2020-06-19 14:54:12.798 [PdfGenerationThreadPoolExecutor-7] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 10
2020-06-19 14:54:12.802 [PdfGenerationThreadPoolExecutor-4] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 11
2020-06-19 14:54:12.805 [PdfGenerationThreadPoolExecutor-17] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 12
2020-06-19 14:54:12.807 [PdfGenerationThreadPoolExecutor-8] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 13
2020-06-19 14:54:12.808 [PdfGenerationThreadPoolExecutor-3] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 14
2020-06-19 14:54:12.811 [PdfGenerationThreadPoolExecutor-1] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 15
2020-06-19 14:54:12.813 [PdfGenerationThreadPoolExecutor-2] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 16
2020-06-19 14:54:12.815 [PdfGenerationThreadPoolExecutor-9] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 17
2020-06-19 14:54:12.817 [PdfGenerationThreadPoolExecutor-11] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 18
2020-06-19 14:54:12.819 [PdfGenerationThreadPoolExecutor-13] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 19
2020-06-19 14:54:12.820 [qtp403879268-30] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Waiting for futures to complete
2020-06-19 14:54:12.830 [PdfGenerationThreadPoolExecutor-20] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Converting PDF for page 1
2020-06-19 14:54:20.398 [PdfGenerationThreadPoolExecutor-6] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 4
2020-06-19 14:54:20.416 [PdfGenerationThreadPoolExecutor-11] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 18
2020-06-19 14:54:20.428 [PdfGenerationThreadPoolExecutor-13] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 19
2020-06-19 14:54:20.458 [PdfGenerationThreadPoolExecutor-19] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 5
2020-06-19 14:54:20.488 [PdfGenerationThreadPoolExecutor-12] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 3
2020-06-19 14:54:20.633 [PdfGenerationThreadPoolExecutor-4] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 11
2020-06-19 14:54:20.802 [PdfGenerationThreadPoolExecutor-14] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 9
2020-06-19 14:54:20.905 [PdfGenerationThreadPoolExecutor-8] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 13
2020-06-19 14:54:20.913 [PdfGenerationThreadPoolExecutor-17] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 12
2020-06-19 14:54:21.095 [PdfGenerationThreadPoolExecutor-7] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 10
2020-06-19 14:54:21.144 [PdfGenerationThreadPoolExecutor-10] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 6
2020-06-19 14:54:21.244 [PdfGenerationThreadPoolExecutor-15] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 7
2020-06-19 14:54:21.293 [PdfGenerationThreadPoolExecutor-20] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 1
2020-06-19 14:54:21.327 [PdfGenerationThreadPoolExecutor-1] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 15
2020-06-19 14:54:21.329 [PdfGenerationThreadPoolExecutor-16] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 8
2020-06-19 14:54:21.335 [PdfGenerationThreadPoolExecutor-3] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 14
2020-06-19 14:54:21.360 [PdfGenerationThreadPoolExecutor-9] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 17
2020-06-19 14:54:21.384 [PdfGenerationThreadPoolExecutor-2] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 16
2020-06-19 14:54:21.404 [PdfGenerationThreadPoolExecutor-5] INFO  c.p.s.a.s.d.s.i.PdfGenerationService - Done converting PDF for page 2

If you notice for each page it is taking ~8s and we wish to bring it down significantly.

Can somebody suggest any improvement or any alternative libraries which will be helpful for us.

Thanks in advance.

1 Answers

If you're happy to wrap CLI tools in Java, you could use wkhtmltopdf, it's written in C++ so it should be much faster.

There are premade wrappings available too.

Other than that, I don't think there are many competitors in terms of speed in Java.

OpenPDF is just a fork of IText, with similar performance presumably.

Related