Apache Fop 및 Java를 사용하여 PDF를 생성하려고하지만 생성 된 Pdf는 항상 빈 페이지입니다. 웹 응용 프로그램에 모두 중첩되어 있으며 Sever는 glassfish입니다.Apache fop : 빈 PDF 출력을 생성합니다.
누군가가 제안을 했습니까? 다음과 같습니다
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" encoding="utf-8" />
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="DealerOverview">
<fo:region-body margin-top="4cm" margin-bottom="2cm" />
<fo:region-before extent="3.5" />
<fo:region-after extent="3.5" />
</fo:simple-page-master>
</fo:layout-master-set>
<xsl:apply-templates select="DealerOverview" />
</fo:root>
</xsl:template>
<xsl:template match="DealerOverview">
<fo:page-sequence master-reference="DealerOverview">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:table table-layout="fixed">
<fo:table-body>
<fo:table-row>
<fo:table-cell text-align="center" font-weight="bold">
<fo:block>Brand</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" font-weight="bold">
<fo:block>TargetYear</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" font-weight="bold">
<fo:block>TargetPrevYear</fo:block>
</fo:table-cell>
</fo:table-row>
<xsl:for-each select="DealerOverview/Brands/Brand">
<fo:table-row>
<fo:table-cell border="solid 1px black" text-align="center">
<fo:block>
<xsl:value-of select="BrandId" />
</fo:block>
</fo:table-cell>
<fo:table-cell border="solid 1px black" text-align="center">
<fo:block>
<xsl:value-of select="TargetYear" />
</fo:block>
</fo:table-cell>
<fo:table-cell border="solid 1px black" text-align="center">
<fo:block>
<xsl:value-of select="TargetPrevYear" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>
</fo:flow>
</fo:page-sequence>
</xsl:template>
<!-- TODO: Auto-generated template -->
</xsl:stylesheet>
와 예-XML-파일 :
여기 내 XSL의
<?xml version="1.0" encoding="UTF-8"?>
<DealerOverview>
<DealerDetails>
<Version>testForDealer</Version>
<Date>Oct, 1, 2013</Date>
<State>Released to Dealer</State>
<Dealer>Ungeheuer Automobile GmBH</Dealer>
<BrandOverview>All</BrandOverview>
</DealerDetails>
<Brands>
<Brand id="BM">
<BrandId>BM</BrandId>
<TargetYear>500</TargetYear>
<TargetPrevYear>1000</TargetPrevYear>
</Brand>
</Brands>
</DealerOverview>
편집 : PDF를 생성해야 자바 코드 ...
public void createPdfWithFop(File xmlString) throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
pathToXsl = servletContext.getRealPath("/resources/reporting/PrintDealersOverview.xsl");
File xslFile = new File(pathToXsl);
String tempString = FileUtils.readFileToString(xmlString);
System.out.println("Das XML-File in der Fop: " + tempString + " ende");
StreamSource source = new StreamSource(xmlString);
StreamSource transformSource = new StreamSource(xslFile);
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent userAgent = fopFactory.newFOUserAgent();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
TransformerFactory factory = TransformerFactory.newInstance();
try {
Transformer transformer = factory.newTransformer(transformSource);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outStream);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(source, res);
byte[] pdfBytes = outStream.toByteArray();
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=\"DealersOverview.pdf\"");
response.getOutputStream().write(pdfBytes);
// response.getOutputStream().flush();
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FOPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
편집 :
내 outputStream에 문제가 있음을 알게되었습니다. 내 웹 응용 프로그램에서 생성 된 파일을 다운로드하기 위해 대화 상자를 표시하려고합니다. 출력물에 문제가있는 것 같지 않습니다 ...
힌트를 보내 주셔서 감사합니다.하지만 해결책이 아닙니다. 아마도 뭔가 내 자바 코드에 문제가있다 ... – bethlis