Java 从XML或HTML生成PDF文件

Java 从XML或HTML生成PDF文件,java,html,xml,pdf,itext,Java,Html,Xml,Pdf,Itext,是否有任何API/解决方案可以从XML文件数据和定义生成PDF报告。 例如,XML定义/数据可以是: <pdf> <paragraph font="Arial">Title of report</paragraph> </pdf> 报告标题 我觉得将HTML转换成PDF也是一个很好的解决方案 目前,我们使用iTextAPI编写Java代码。我想将代码外部化,以便非技术人员可以编辑和更改。看一看。使用XSLT样式表将XML(或XHTML

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

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

报告标题
我觉得将HTML转换成PDF也是一个很好的解决方案

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

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

ApacheFop可以为大型文档(例如200页的PDF)使用大量内存,这可能需要调整存储空间。

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

有一个从XML(我想还有HTML)生成PDF的工具,但我发现很难分辨。除此之外,我从未找到任何关于支持内容的好文档。我的方法是查看源代码,找出什么是可以接受的。虽然不理想,但它相当直截了当

<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

这是一个例子
...
导入com.lowagie.text.Document;
导入com.lowagie.text.DocumentException;
导入com.lowagie.text.pdf.PdfWriter;
导入com.lowagie.text.xml.SAXiTextHandler;
...
字符串inXml=“”//以上面的xml为例
ByteArrayOutputStream温度=新建ByteArrayOutputStream();
文档=新文档();
PdfWriter writer=null;
尝试
{
writer=PdfWriter.getInstance(文档,临时文件);
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
parse(新的ByteArrayInputStream(inXml),新的SAXiTextHandler(document));
}
捕获(例外e)
{
//相反,捕捉适当的异常并做一些有意义的事情
e、 printStackTrace();
}
最后
{
if(writer!=null)
{
尝试
{
writer.close();
}
捕获(异常忽略)
{
//忽略
}
}//如果
}
//temp持有PDF文件
看一看,我认为它使用iText导出文件,而且它的IDE很简单,可以被非程序员使用


编辑:我忘了提到,您可以在应用程序中直接使用JasperReports引擎,也可以使用

您需要使用受良好支持的XML格式,因为它允许您利用其他人的工作

一种受良好支持的XML格式是DocBook XML,这似乎是使用XSLT和DocBook样式表以及其他格式来处理XML->PDF的一个很好的资源


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

请参阅我的答案,以获得关于“XSLT样式表”的建议。关于“CSS+XHTML到PDF”技术,请参阅问题和答案。