2013-10-02 1 views
0

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에 문제가 있음을 알게되었습니다. 내 웹 응용 프로그램에서 생성 된 파일을 다운로드하기 위해 대화 상자를 표시하려고합니다. 출력물에 문제가있는 것 같지 않습니다 ...

답변

0

위의 변환을 실행하면 출력물이 생기기 때문에 빈 페이지가 표시된다고 말하는 것이 확실하지 않습니다.

그러나 각자의 for-each가 올바르지 않은 것으로 나타났습니다. 귀하의 선택은 DealerOverview/Brands/Brand을 찾고 있지만 이미 존재하는 DealerOverview 템플릿에 있기 때문에이 위치에 존재하지 않는 DealerOverview/DealerOverview/Brands/Brand 요소를 찾고 있습니다. 따라서 DealerOverview을 선택에서 제거하면 출력에서 ​​추가 정보를 얻을 수 있습니다.

+0

힌트를 보내 주셔서 감사합니다.하지만 해결책이 아닙니다. 아마도 뭔가 내 자바 코드에 문제가있다 ... – bethlis