Более эффективный способ преобразования HTML в PDF, чем XHTMLRenderer + iText - PullRequest
1 голос
/ 13 марта 2012

Мы используем iText + XHTMLRenderer для конвертации больших HTML-файлов в PDF-файлы. Сегодня ему удалось собрать все ресурсы в нашей среде разработки и вывести из строя:

This is a jstack dump:
02aaabc585000 nid=0x3af7 runnable [0x00002aaaf0269000]
   java.lang.Thread.State: RUNNABLE
    at java.awt.geom.Path2D$Double.rectCrossings(Path2D.java:1288)
    at java.awt.geom.Path2D.intersects(Path2D.java:2290)
    at java.awt.geom.Path2D.intersects(Path2D.java:2314)
    at org.xhtmlrenderer.layout.BoxCollector.intersectsAggregateBounds(BoxCollector.java:90)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:121)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:139)
    at org.xhtmlrenderer.layout.BoxCollector.collect(BoxCollector.java:46)
    at org.xhtmlrenderer.layout.Layer.paint(Layer.java:314)
    at org.xhtmlrenderer.pdf.ITextRenderer.paintPage(ITextRenderer.java:384)
    at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:348)
    at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:315)
    at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:246)

Это свалка гисто:

num     instances         bytes  class name
1:       1344539      776639912  [B
2:       1798853      301253344  [C
3:        535059       72768024  org.xhtmlrenderer.render.InlineLayoutBox
4:        762761       52412032  [Ljava.lang.Object;
5:       1519522       48624704  java.lang.String
6:       1149491       45979640  com.someco.p.d
7:        203533       38674984  [I
8:        216490       31313568  <constMethodKlass>
9:        216490       29455216  <methodKlass>
10:        387065       24772160  org.xhtmlrenderer.render.InlineBox
11:         23732       23915216  <constantPoolKlass>
12:        727350       23275200  java.awt.Rectangle
13:        243878       23095936  [Ljava.util.HashMap$Entry;
14:        147045       22350840  org.xhtmlrenderer.render.LineBox
15:        667914       21373248  java.util.HashMap$Entry
16:        855194       20524656  java.util.concurrent.LinkedBlockingQueue$Node
17:         23732       18543256  <instanceKlassKlass>
18:        537890       17212480  org.xhtmlrenderer.css.style.derived.RectPropertySet
19:        688836       16532064  org.xhtmlrenderer.layout.PaintingInfo
20:        688836       16532064  java.awt.Dimension
21:        264061       15254448  <symbolKlass>
22:        268028       15009568  org.xhtmlrenderer.render.InlineText  

Очевидно, это произошло из-за (очень, очень) большого HTML-файла, который конвертируется. Это заставило нас задуматься - что лучше - заблокировать преобразование больших файлов HTML или найти более эффективные средства преобразования HTML в PDF , не переводя HTML сначала на «экран» (вот что XHTMLRednerer делает в основном).

Поиск в Google и чтение в Интернете не принесли хороших альтернатив. Все они сделаны некоторыми отрывочными компаниями, которым мы не можем доверять. У кого-нибудь есть альтернатива?

1 Ответ

2 голосов
/ 14 марта 2012

http://sourceforge.net/projects/xmlworker/

XMLWorker используется для поставки с iText как HTMLWorker. Он может не работать с html, который слишком сложен, но попробуйте.

Текущее решение, конечно, заключается в использовании pdfHTML (дополнение iText7) в сочетании с iText7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...