- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我将 Flying Saucer 与 IText 结合使用,以便从 HTML 文件生成 PDF,特别是利用 org.xhtmlrenderer.pdf.ITextRenderer 类。我的代码很简单。生成代码封装在如下方法中:
/* PDfGenerator class only has ONE instance */
public PdfGenerator() {
this.renderer = new ITextRenderer(); //This is a class variable that only gets instantiated ONCE
}
public void generatePDF(String outputFilePath, String htmlContent) {
renderer.setDocumentFromString(htmlContent);
renderer.layout();
renderer.createPDF(new BufferedOutputStream(
new FileOutputStream(new File(outputFilePath)), BUFFER_SIZE), true);
renderer.finishPDF();
}
编辑:
我的生成器类实际上由 Spring 作为单例对象进行管理。我有一个管理器类,它有一个 ExecutorService 作为 PDF 生成任务的队列。该管理器使用单例生成器来生成对象。因此,我只实例化 ITextRenderer 一次并重用它。现在我将队列设置为同时操作最多 2 个线程。我刚刚意识到这可能是导致的原因,因为我遇到了两个线程使用我的一个渲染器来渲染两组独立的 PDF 的情况。
现在,我刚刚意识到我实际上在每次渲染时调用“完成”两次!一个是在 createPDF()
错误调用中(将 true 作为第二个参数传递),另一个是对 finishPDF()
的显式调用。
它已经运行了相当长一段时间了,并且大多数都成功地生成了 PDF。我偶尔遇到两种不同类型的错误:
由于保存/恢复状态运算符不平衡而导致的运行时异常。示例堆栈跟踪如下:
java.lang.RuntimeException: Unbalanced save/restore state operators.
at com.lowagie.text.pdf.PdfContentByte.restoreState(Unknown Source) ~[itext-2.0.8.jar:na]
at org.xhtmlrenderer.pdf.ITextOutputDevice.setClip(ITextOutputDevice.java:737) ~[core-renderer-R8.jar:na]
at org.xhtmlrenderer.pdf.ITextRenderer.paintPage(ITextRenderer.java:387) ~[core-renderer-R8.jar:na]
at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:348) ~[core-renderer-R8.jar:na]
at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:315) ~[core-renderer-R8.jar:na]
at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:280) ~[core-renderer-R8.jar:na]
生成的 PDF 有缺失/变形的部分,或者最坏的情况是空白页。
对于问题 2,我相当有信心这是由于调用 finishPDF() 两次造成的。但是,对于问题 1,它发生在执行 finishPDF() 调用之前,因此我实际上不知道这是否是导致问题的原因。
有人在使用 Flying Saucer 和 iText 时有过处理这两个问题的经验吗?
最佳答案
我遇到的问题基本上是在不同线程上同时访问相同的 ITextRenderer 实例,从而扰乱当前运行的 PDF 生成作业的处理。
我已经使 Executor 服务仅使用 1 个线程,并使生成作业按顺序进行,并且根据我的观察,只要一次处理一个,我就可以重用相同的 ITextRenderer。
我已经向 Flying Saucer 库的开发人员发送了询问以确认这一点,我将在他们回复时更新这篇文章。
顺便说一句,我只需弄清楚使用 1 个线程和 1 个预实例化的 ITextRenderer 实例生成或使用多个线程但按线程实例化 ITextRenderer 是否更有效。
关于java - FlyingSaucer ITextRenderer 完成错误(不平衡的保存/恢复和空白 PDF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12512169/
当我通过 Flyingsaucer 将 html 文件导出为 PDF 时,CSS 样式“word-wrap:break-word”不起作用。 我在css文件中定义了一个类 .class-name{
我正在尝试使用 flyingsaucer提供从 xhtml 生成的 pdf,但我无法运行 servlet 示例。 所有其他 flyingsaucer 示例对我来说都很好,但我需要它作为 servlet
FS 发行版与 IText 2.0.8 捆绑在一起,鉴于 2.x.x 范围内有许多最新版本,我想知道是否有人对最新版本有任何经验。我猜 FS 也有可能与 3.x.x.x +...兼容 有人知道/确认吗
我有一个解决方案,可以将字符串插入 XHTML 文档并将结果打印为报告。我的雇主问我们是否可以从他们的 SQL 数据库(存储为字节数组)中提取图像以插入到报告中。 我使用 FlyingSaucer 作
有什么方法可以在使用 Flying Saucer 生成的 PDF 中使用 javascript(在打开文档时立即显示打印对话框)? 最佳答案 请检查这个link ,(第 14 页,共 27 页)这说明
环境是:flyingsaucer r8 和 itext 2.0.8 我要用 flyingsaucer 和 itext 创建 pdf 文件,我添加了 table-layout:fixed;word-wr
我将 Flying Saucer 与 IText 结合使用,以便从 HTML 文件生成 PDF,特别是利用 org.xhtmlrenderer.pdf.ITextRenderer 类。我的代码很简单。
我想使用 FlyingSaucer 将包含阿拉伯字符的 HTML 页面转换为 PDF 文件,但生成的 PDF 不包含组合字符并向后打印输出。 HTML:
我正在使用飞碟 xhtmlrenderer 构建 pdf 文档。到目前为止一切正常——现在我们应该在 pdf 中生成阿拉伯语文本。Xhtmlrenderer 正在以相反的顺序呈现阿拉伯文本。 我在互联
我在使用找到的简单示例创建 PDF 时遇到问题 here .这是我第一次尝试使用它,我尝试了一些东西并进行了大量搜索,但没有找到产生错误的原因。错误源自 renderer.setDocument(ur
我正在使用带有以下 HTML 模板的 FlyingSaucer 9 生成带有运行标题的 PDF: @page { size: 793px 1122px; border: 1px sol
我正在尝试使用 FlyingSaucer 将带有居中图像的 xhtml 解析为 PDF。 图像使用 css 居中: img.center { display: block; marg
我是一名优秀的程序员,十分优秀!