首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种比XHTMLRenderer+iText更有效的将HTML转换为PDF的方法

一种比XHTMLRenderer+iText更有效的将HTML转换为PDF的方法
EN

Stack Overflow用户
提问于 2012-03-13 15:19:17
回答 1查看 1.5K关注 0票数 1

我们使用iText+XHTMLRenderer将大型HTML文件转换为PDF。今天,它成功地占用了我们开发环境中的所有资源,并使其无法使用:

代码语言:javascript
复制
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)

这是他的垃圾场:

代码语言:javascript
复制
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所做的)。

在网上搜索和阅读并没有带来好的选择。他们都是一些我们不知道我们可以信任的粗略公司。有谁有别的选择吗?

EN

回答 1

Stack Overflow用户

发布于 2012-03-14 16:17:35

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

XMLWorker过去常随iText一起发货,作为HTMLWorker。它可能在过于复杂的html上不起作用,但是尝试一下。

目前的解决方案当然是结合使用pdfHTML ( iText7外接程序)和iText7。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9686882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档