【问题标题】:Xpages PDF creation using the XMLWorker class使用 XMLWorker 类创建 Xpages PDF
【发布时间】:2013-05-15 11:46:17
【问题描述】:

使用 SSJS 我已经使用 iText 附带的简单 HTML 解析器成功地创建了一个 PDF,但是简单的 HTML 解析器不尊重 CSS 并且非常有限。我从 iText 站点下载了 XMLWorker 类,并尝试改用它,但我对如何调用 Java 包的了解太有限了。我能找到的所有示例都使用 Java 并直接引用这些类,例如。

Document newPDF = new Document();

但是在 SSJS 中我们必须使用点符号,例如。

var newPDF:com.itextpdf.text.Document = new com.itextpdf.text.Document();

这 - 我认为 - 是我绊倒的地方。我的代码如下所示:

function createLPO2(pReqDoc:NotesDocument) {

importPackage(com.itextpdf);
//importPackage(com.itextpdf.tool.xml.XMLWorkerHelper);
importPackage(java.io);

var con = facesContext.getExternalContext();
var response:com.ibm.xsp.webapp.XspHttpServletResponse = con.getResponse();

response.setContentType("application/pdf");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", -1);
response.setHeader("Content-Disposition","attachment; filename=\"LPO_" + pReqDoc.getItemValueString("RequisitionNo") + ".pdf\"");

var newPDF:com.itextpdf.text.Document = new com.itextpdf.text.Document();
var writer = com.itextpdf.text.pdf.PdfWriter.getInstance(newPDF,response.getOutputStream());
var xmlWorkerHelper = com.itextpdf.tool.xml.XMLWorkerHelper.getInstance();

var strHTML = getTestHTML(); //this is the HTML used in the examples on the iText site

xmlWorkerHelper.parseXHtml(writer, newPDF, new java.io.StringReader(strHTML));

newPDF.close();
writer.close();

facesContext.responseComplete();
}

如果我按原样运行此脚本,我会在 Domino 控制台上收到脚本错误。如果我删除importPackage(com.itextpdf.tool.xml.XMLWorkerHelper); 行上的注释,则会出现完全不同的错误。我怀疑我必须导入 XMLWorkerHelper 包,而不仅仅是 com.itextpdf 包。我想如果我使用 7-zip 之类的工具打开 jar 文件,我可以计算出路径,这就是我到达 com.itextpdf.tool.xml.XMLWorkerHelper 的方式

这是对的吗?如果是这样,为什么我的脚本会失败?

【问题讨论】:

  • 你遇到了什么脚本错误?
  • 你必须导入一个包,而不是一个类:importPackage(com.itextpdf.tool.xml)
  • 谢谢斯文 - 我不知道。尽管我已经使用 Notes 多年,但我对 Java 完全陌生。我对客户端 JavaScript 有很好的了解,并且发现学习服务器端 JavaScript 很容易,但 Java 仍然是个谜。

标签: itext xpages


【解决方案1】:

罗伯, 说真的,不要尝试在 SSJS 中这样做。 iText 完全是 Java,如果你试图用不同的语言来处理它,它会让你感到压力。创建一个包装类,该类具有一个方法,该方法采用 OutputStream 和您需要的任何数据(文档、视图等)。在您的 SSJS 中获取 OutputStream 并调用该函数。查找 OpenNTF 上的 XAgent XSnippet 和我的关于 PDF 创建的博客系列(最后两个缺少 - 请耐心等待)。 提醒一句:iText 是 GPL,因此您要么将软件也采用 GPL,要么购买商业 iText 许可证,要么寻找 Apache PDFBox 或 Apache FOP 等替代品。啊第二个警告:HTML 到 PDF 是一个 Pita。您可以查看商业工具,例如来自 Swing 软件(或改变你的方法)

【讨论】:

  • 观看即将在 NotesIn9 上有关 Wrappers 的演讲
  • 感谢您的回答。我接受你是对的,但我还是迷路了。我查看了您的博客并找到了有关 XML 和 XSL:FO 和 XSLT 的文章。我了解这些原则,但我如何创建“采用 OutputStream 的包装器类”的细节对我来说仍然是一个完全的谜。我花了太长时间在谷歌上搜索在 Xpages 中实现 Java 的初学者指南,但没有成功。例如,我发现了很多关于“托管 bean”以及如何在“faces-config.xml”中指向它们的内容,但没有说明在 nsf 中将托管 bean 存储在哪里。我猜“包装类”是托管 bean?
  • 嗨 Rob,要向 XPage 添加 Java 类,只需在 Code/Java 设计元素中编写一个代码(在 8.5.3 之前,您可以将其放在 webcontent/web-inf/src 中并添加到构建路径)。包装器只是一个简单的 Java 类,它接受所有需要的参数。Follow this example com.notessensei.tools.PDFFormatter 是一个包装器类。除了实例化类之外,Java 的所有内容都在里面,所以你的 SSJS 变得精简和卑鄙
猜你喜欢
  • 2014-04-01
  • 2015-08-23
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2016-12-16
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多