-1

是否有任何 API/解决方案可以从 XML 文件数据和定义生成 PDF 报告。例如,XML 定义/数据可以是:

<pdf>
    <paragraph font="Arial">Title of report</paragraph>
</pdf>

我觉得将 HTML 转换为 PDF 也会是一个很好的解决方案。

目前我们使用 iText API 编写 Java 代码。我想将代码外部化,以便非技术人员可以编辑和更改。

4

5 回答 5

10

看看Apache FOP。使用 XSLT 样式表将 XML(或 XHTML)转换为 XSL-FO。然后使用 FOP 读取 XSL-FO 文档并将其格式化为 PDF 文档(请参阅使用 FOP 的 Hello World)。

Apache FOP 可以将大量内存用于大型文档(例如,200 页的 PDF),这可能需要调整JVM 内存设置

于 2009-11-22T00:43:51.967 回答
4

iText具有从 XML(和 HTML,我认为)生成 PDF 的工具。这是 DTD,但我发现很难整理。除此之外,我从来没有找到任何关于支持什么的好的文档。我的方法是查看SAXiTextHandlerElementTags的源代码,以确定什么是可以接受的。虽然不理想,但它非常简单。

<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
于 2009-11-22T01:27:26.203 回答
3

看看JasperReports,我认为它使用 iText 导出文件,它的 IDE 很简单,非程序员也可以使用。

编辑:我忘了提,您可以直接在您的应用程序中使用 JasperReports 引擎,或者您可以使用iReport“JasperReports 设计器”

于 2009-11-22T09:45:27.297 回答
1

您将希望为此使用受良好支持的 XML 格式,因为它允许您利用其他人的工作。

一个得到很好支持的 XML 格式是 DocBook XML - http://www.docbook.org/ - 而这个 - http://sagehill.net/docbookxsl/index.html - 似乎是一个很好的关于做 XML -> PDF 的资源将 XSLT 与 Docbook 样式表和其他格式一起使用。

这种方法允许您使用任何 XSLT 处理器和任何 XSL/FO 处理器来获得结果。这使您可以轻松编写脚本以及在需要时自由切换实现 - 特别是当生成的 PDF 变得“太大”时,较旧的 Apache FOP 实现会严重降级。

于 2009-11-22T11:28:43.820 回答
0

Prince是目前最好的工具之一。它使用 CSS 作为样式,因此如果您喜欢这种将数据与显示分离的方法(请阅读:您的用户也可以这样做),它可能非常适合您。(相比之下,浏览器通过 CSS 提供的对显示的控制是原始的。)

于 2009-11-22T01:13:39.430 回答