Itext HtmlConverter.convertToPdf 将 html 转换为 pdf 的速度很慢

Ant*_*ksh 5 pdf pdf-generation itext java-8

我需要将 HTML 实时转换为 PDF。同样,我正在使用 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());
    } 
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果页数在 30-50 范围内,即使我使用 20 个线程并行转换每个 html 页面,我也会看到巨大的周转时间,每页 5-10 秒。

其中一个例子有 19 页和 20 个线程,日志如下:


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
Run Code Online (Sandbox Code Playgroud)

如果您注意到每个页面都需要大约 8 秒,我们希望将其显着缩短。

有人可以提出任何改进或任何对我们有帮助的替代库吗?

提前致谢。

Ale*_*s99 0

如果您愿意用 Java 封装 CLI 工具,您可以使用wkhtmltopdf,它是用 C++ 编写的,所以它应该更快。

也有预制的包装材料可供选择

除此之外,我认为 Java 在速度方面没有太多竞争对手。

OpenPDF只是 IText 的一个分支,大概具有类似的性能。