如何以最小的内存占用直接将大型内容流式传输到PDF?

如何以最小的内存占用直接将大型内容流式传输到PDF?,pdf,streaming,java,Pdf,Streaming,Java,我正在尝试以最小的内存占用(比如每个客户端/线程20 MB)将大量格式化数据流式传输到PDF。PDF结构是用Adobe postscript编写的,直接用PDF postscript格式编写非常复杂。我一直在使用以下API将内容流式传输到PDF 贾斯珀报道 文字 Jasper reports面临的问题是,它需要将所有输入数据放入内存中,并且只支持OutputStream。Jasper报告中有一个支持InputStream数据的函数,但在后端,Jasper会将整个InputStream数据加载

我正在尝试以最小的内存占用(比如每个客户端/线程20 MB)将大量格式化数据流式传输到PDF。PDF结构是用Adobe postscript编写的,直接用PDF postscript格式编写非常复杂。我一直在使用以下API将内容流式传输到PDF

  • 贾斯珀报道
  • 文字
Jasper reports面临的问题是,它需要将所有输入数据放入内存中,并且只支持OutputStream。Jasper报告中有一个支持InputStream数据的函数,但在后端,Jasper会将整个InputStream数据加载到内存中,并有效地耗尽内存

iText的问题在于它是商业性的。我现在希望编写自己的JavaAPI,将格式化数据(包括表格、图像)直接传输到PDF。为了理解PDF结构,我参考了以下书籍:

  • Adobe提供的Pdf结构
  • Pdf解释(O'REILLY)
上述书籍仅涵盖基本的PDF格式,如文本和2D图形。如何在PDF中绘制表格、图标以及能够使用HTML/CSS生成的所有其他格式

我需要一些关于深入理解PDF结构的指导。或者,是否已经有一个Java API支持将输入内容直接流式传输到PDF,而不将整个数据保存在内存中


注:无头浏览器(PhantomJS、wkhtmltopdf)、ApacheFop、ApachePDFBox通过在内存中加载整个数据来呈现PDF。

“我需要一些深入理解PDF结构的指针。”-PDF规范ISO 32000,最好是第2部分。“或者,是否已经有一个Java API支持将输入内容直接流式传输到PDF,而不将整个数据保存在内存中?”-您已经尝试过的iText确实试图保持较低的内存占用率。“iText的问题是它是商业化的。”-它是双重许可的:如果您使用AGPL许可您的产品,您可以在AGPL下免费使用iText。如果你不能,你的产品很可能是商业化的,那么为什么使用商业库是一个问题呢?我将研究PDF ISO规范第2部分。我现在不想要商业上的依赖关系。我如何将表格、图标和我能够用HTML/CSS生成的所有其他格式绘制成PDF?使用2D图形。另请参见PDFBox支持使用暂存文件,因此它使用的内存更少。直到最近,创建PDF时才很好地支持这一点,但2.0.12或当前的快照版本将支持这一点?我面临着类似的问题,但我可以购买商业产品,所以考虑itext