是否有任何API /解决方案可以从XML文件数据和定义生成PDF报告。 例如,XML定义/数据可以是:
<pdf>
<paragraph font="Arial">Title of report</paragraph>
</pdf>
将HTML转换为PDF也是一个很好的解决方案。
目前我们使用iText API编写Java代码。我希望外部化代码,以便非技术人员可以编辑和进行更改。
答案 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,但我发现很难理清。除此之外,我从来没有找到任何关于支持内容的好文档。我的方法是查看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
答案 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提供的显示控制是原始的。)