是否有任何 API/解决方案可以从 XML 文件数据和定义生成 PDF 报告。例如,XML 定义/数据可以是:
<pdf>
<paragraph font="Arial">Title of report</paragraph>
</pdf>
我觉得将 HTML 转换为 PDF 也会是一个很好的解决方案。
目前我们使用 iText API 编写 Java 代码。我想将代码外部化,以便非技术人员可以编辑和更改。
看看Apache FOP。使用 XSLT 样式表将 XML(或 XHTML)转换为 XSL-FO。然后使用 FOP 读取 XSL-FO 文档并将其格式化为 PDF 文档(请参阅使用 FOP 的 Hello World)。
Apache FOP 可以将大量内存用于大型文档(例如,200 页的 PDF),这可能需要调整JVM 内存设置。
iText具有从 XML(和 HTML,我认为)生成 PDF 的工具。这是 DTD,但我发现很难整理。除此之外,我从来没有找到任何关于支持什么的好的文档。我的方法是查看SAXiTextHandler和ElementTags的源代码,以确定什么是可以接受的。虽然不理想,但它非常简单。
<itext orientation="portrait" pagesize="LETTER" top="36" bottom="36" left="36" right="36" title="My Example" subject="My Subject" author="Me">
<paragraph size="8" >This is an example</paragraph>
</itext>
...
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.xml.SAXiTextHandler;
...
String inXml = ""; //use xml above as an example
ByteArrayOutputStream temp = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter writer = null;
try
{
writer = PdfWriter.getInstance(document, temp);
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new ByteArrayInputStream(inXml), new SAXiTextHandler(document));
}
catch (Exception e)
{
// instead, catch the proper exception and do something meaningful
e.printStackTrace();
}
finally
{
if (writer != null)
{
try
{
writer.close();
}
catch (Exception ignore)
{
// ignore
}
} // if
}
//temp holds the PDF
看看JasperReports,我认为它使用 iText 导出文件,它的 IDE 很简单,非程序员也可以使用。
编辑:我忘了提,您可以直接在您的应用程序中使用 JasperReports 引擎,或者您可以使用iReport“JasperReports 设计器”
您将希望为此使用受良好支持的 XML 格式,因为它允许您利用其他人的工作。
一个得到很好支持的 XML 格式是 DocBook XML - http://www.docbook.org/ - 而这个 - http://sagehill.net/docbookxsl/index.html - 似乎是一个很好的关于做 XML -> PDF 的资源将 XSLT 与 Docbook 样式表和其他格式一起使用。
这种方法允许您使用任何 XSLT 处理器和任何 XSL/FO 处理器来获得结果。这使您可以轻松编写脚本以及在需要时自由切换实现 - 特别是当生成的 PDF 变得“太大”时,较旧的 Apache FOP 实现会严重降级。
Prince是目前最好的工具之一。它使用 CSS 作为样式,因此如果您喜欢这种将数据与显示分离的方法(请阅读:您的用户也可以这样做),它可能非常适合您。(相比之下,浏览器通过 CSS 提供的对显示的控制是原始的。)