从XML或HTML生成PDF文件

时间:2009-11-22 00:40:55

标签: java html xml pdf itext

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

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

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

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

5 个答案:

答案 0 :(得分:10)

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

Apache FOP可以为大型文档(例如,200页PDF)使用大量内存,这可能需要调整JVM memory settings

答案 1 :(得分:4)

iText有一个从XML(和HTML,我认为)生成PDF的工具。 Here is the 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

答案 2 :(得分:2)

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

编辑:我忘了提及,您可以直接在您的应用程序中使用JasperReports引擎,或者您可以使用iReport "Designer for JasperReports"

答案 3 :(得分:1)

您需要使用支持良好的XML格式,因为它可以让您利用其他人的工作。

支持良好的XML格式是DocBook XML - http://www.docbook.org/ - 而这 - http://sagehill.net/docbookxsl/index.html - 似乎是执行XML的好资源 - &gt; PDF使用XSLT与Docbook样式表和其他格式。

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

答案 4 :(得分:0)

Prince是最好的工具之一。它使用CSS作为样式,所以如果你欣赏从显示中分离数据的方法(阅读:你的用户也可以这样做),它可能非常适合你。 (通过CSS,浏览器通过CSS提供的显示控制是原始的。)