我想使用apache fop從jaxb-object生成pdf文件並生成itext PdfStamper來修改它。由於fop寫入outputStream並且PdfStamper從InputStream讀取,我的想法是使用Piped [I | O]流來完成此操作。這裏是我的嘗試:使用apache fop與PipedOutputStream
public void transform2XSLFO_onthefly(Medium medium, OutputStream out) throws Exception {
PipedInputStream pInputPipe = new PipedInputStream();
PipedOutputStream outputTemp = new PipedOutputStream(pInputPipe);
try {
JAXBSource source = new JAXBSource(JAXBContext.newInstance(medium.getClass()) , medium);
FOUserAgent userAgent = fopFactory.newFOUserAgent();
// settings
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, userAgent ,outputTemp);
InputStream XSLinputStream = xslfoStylesheet.getInputStream();
StreamSource XSLsource = new StreamSource(XSLinputStream);
Result res = new SAXResult(fop.getDefaultHandler());
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer(XSLsource);
// run transformation
t.transform(source, res);
// does not come so far, no use closing the stream
outputTemp.close();
PdfReader reader = new PdfReader(pInputPipe);
pdfStamper = new PdfStamper(reader, out);
//..... postProcess...
pdfStamper.close();
} catch (Exception ex) {
log.error("ERROR", ex);
}
然而,在該行掛起「t.transform(源,RES);」,看起來他正在等待在FOP轉化的中間有東西。它的工作原理採用BypeArrayOutputStream並將其轉換爲InputStream和使用它的PdfStamper輸入:
InputStream pdfInput = new ByteArrayInputStream(((ByteArrayOutputStream) outputTemp).toByteArray());
但這些文件可以得到相當大(幾MB),所以我認爲,管道版本將有更好的表現!你怎麼看?
我很確定FOP需要在開始輸出東西之前構建幾乎整個文件。例如,對於目錄的任何前向引用都必須被延遲,直到幾乎處理完所有文件。因此,管道不會爲你買東西。 –
@bobDalgleish我不理解你的評論,或者你錯過了我的意見:我希望fop處理整個文件,然後我想在fop創建它之後鏈接文件的itext操作! –