gpt4 book ai didi

java - 如何使用 JasperFillManager.fillReportToStream?

转载 作者:行者123 更新时间:2023-12-04 05:26:43 30 4
gpt4 key购买 nike

我有一个简单的 Java 程序,它接受一个 .jrxml 文件,编译它,然后填充它。报告的数据在 XML 文件中提供。填写完成后,数据将导出为 PDF

// Parse input document
Document document = JRXmlUtils.parse(new File(xmlFile));

// Set it as the data source in the parameters
parameters.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document);

// Create and set the virtualizer
JRFileVirtualizer virtualizer = new JRFileVirtualizer(2, "/tmp");
virtualizer.setReadOnly(true);
parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

// Fill the report
String jasperFile = designFile.replaceAll(".jrxml",".jasper");
print = JasperFillManager.fillReport(jasperFile, parameters);

// Export the report to PDF
ArrayList<JasperPrint> jasperPrints = new ArrayList<JasperPrint>();
jasperPrints.add(print);
JRPdfExporter exp = new JRPdfExporter();
exp.setParameter (JRExporterParameter.JASPER_PRINT_LIST, jasperPrints);
exp.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFileName );
exp.exportReport();

我的困惑是关于导出

上面的填充行非常适合小型报告,但是一旦我得到一个接近 1/2 MB 的 XML 源文件,它就会旋转超过一天,无论设置文件 虚拟器(我做的)。

我看到还有另一种方法叫做 fillReportToSteam。我的困惑是,对于 fillReport,我必须执行额外的步骤才能导出为 PDF。 fillReportToStream 正在写入哪种流,我如何指定它? fillReportToStream 会写入 PDF 文件吗?

我没能找到任何例子。我希望我可以利用流,以便我可以衡量进度并让这些 PDF 在正常的时间跨度内完成。

最佳答案

调用 fillReportToStream 仍然会生成一个 JasperPrint 对象,但它会将其直接写入输出流,而不是将其传回给您。 JasperFillManager 无法以任何其他格式输出报告,因此不能跳过导出步骤。要生成 PDF,您仍然需要使用 JRPdfExporter 并从输出流写入报告的任何位置读取填充的报告。

我认为这里的问题是你的文件虚拟器。您提到“无论设置文件虚拟器如何,它都会旋转一天以上”,但虚拟器实际上会使该过程花费更长。这是避免内存不足错误的基本时间/内存权衡,但会使填充速度变慢。在我看到的基准测试中,添加文件虚拟器使填充时间翻了两番!

如果您确实需要虚拟器,请尝试增加您传递的 maxSize 参数。 2 看起来很低。您也可以尝试切换到 JRSwapFileVirtualizer,因为我听说它们的性能要好得多。

关于java - 如何使用 JasperFillManager.fillReportToStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13127789/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com