我最近遇到了一个性能问题,涉及 ITextSharp 需要很长时间(通常是 30 多秒)来呈现 HTML 内容(从 CKEditor、TinyMCE 等 HTML 编辑器传递)。
以前,HTMLWorker 用于解析内容,效果很好。它快速且相当准确,但是当开始传入更复杂的 HTML(例如表格、有序列表和无序列表)时,它开始动摇:
//The HTML Worker was quick, however it's weaknesses began to show with more
//complex HTML
List<IElement> objects = HTMLWorker.ParseToList(sr, ss);
在这种情况下,复杂的标记是必需的,我没有尝试执行正则表达式手术和其他讨厌的事情来尝试解决这些问题,而是选择使用 XMLWorker 来处理解析。
//This outputs everything perfectly and retains all of the proper styling that is
//needed. However, when things get complex it gets sluggish
XMLWorkerHelper.GetInstance().ParseXHtml(writer,document,stringReader);
XMLWorker 结果令人难以置信,它输出了我们需要的所有内容,但它的性能使它几乎无法使用。随着内容的复杂性增加(通过额外的表格、样式和列表),加载时间也增加了。
上面的行似乎是性能瓶颈,使用它尝试几种不同的替代方案根本没有帮助(例如创建一个基本的自定义 XmlHandler)。
可能的原因和想法
我尝试检查并从传入的内容中删除任何无关的和无效的标记,但这并没有起到什么作用。
问题可能出在 iTextSharp 本身以及 XMLWorkerHelper 的工作方式上吗?我尝试在这里的 iText XML Helper Demo中使用 SAME 输入,而且速度非常快。我认为性能至少具有可比性。
当前的考虑是使用一种存储方法来实际存储呈现的 PDF,然后按需检索它们,而不是动态生成它们。我宁愿避免这种情况,但它在桌面上。
内容是从 Microsoft Word ( cringe ) 中粘贴的,我已尝试尽可能多地清理它,但我认为这不是一个大问题,因为上面提到的 iText 演示对于相同的内容没有大问题。
使用 iTextSharp 的可能替代方法?
我很乐意提供任何其他详细信息和代码。