2014-04-29 5 views
0

하나의 xslt 변환을 만들고 pdf, png, svg 파일로 출력을 렌더링하는 방법이 있습니까? 경우 하나의 FOP XSLT 변환이지만 다른 파일이 렌더링 됨

StreamSource contentSource = new StreamSource(xmlContentStream); 
StreamSource transformSource = new StreamSource(xslFoMarkupStream); 

ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 

Transformer xslfoTransformer = getTransformer(transformSource); 

Fop fop = fopFactory.newFop("application/pdf", foUserAgent, outStream); 

Result res = new SAXResult(fop.getDefaultHandler()); 

// Start XSLT transformation and FOP processing 
xslfoTransformer.transform(contentSource, res); 

xmlContentStream.close(); 
xslMarkupStream.close(); 
return outStream; 

위의 PDF를 생성 한 후 PNG 내가 다른 MIME 타입으로 새 FOP 인스턴스를 생성해야하고 다시 xslfoTransformer.transform()를 호출.

즉 변환을 두 번 수행하지만 변환을 한 번 실행 한 다음 다른 형식으로 출력을 렌더링하는 방법이 있는지 궁금합니다. (사용자 지정 렌더러)

또는 PDF, PNG, SVG에 대해 한 번 여러 번 수행해야하므로 렌더링 속도를 높이는 제안이있을 수 있습니다.

또한 FOP를 통해 PDF를 생성하고 Apache PdfBox를 통해 이미지로 변환하려고 시도했습니다. 그것은 약간 더 빠르게 작동하지만 어리석은 것처럼 보입니다.

감사합니다.

답변

0

한 단계를 저장할 수 있습니다. 코드는 위의 2 단계를 수행합니다. 임의의 XML을 가져 와서 XSL : XSLT를 사용하여 FO로 변환 한 다음 원하는 형식으로 출력을 렌더링합니다. 변환 XML을 XSL : FO (아마도 더 느린 부분)로 한 번 수행하여 그 결과를 2 개의 FO 인스턴스에 대한 입력으로 사용할 수 있습니다. 이런 식으로 뭔가 :

public void fopReport(OutputStream pdfOut, OutputStream jpgOut, Source xmlSource, Source xsltSource) throws Exception { 
      // Create the FO content 
      TransformerFactory factory = TransformerFactory.newInstance(); 
      Transformer transformer = factory.newTransformer(xsltSource); 
      ByteArrayOutputStream foBytesStream = new ByteArrayOutputStream(); 
      StreamResult foByteStreamResult = new StreamResult(foBytesStream); 
      transformer.transform(xmlSource, foByteStreamResult); 
      byte[] foBytes = foBytesStream.toByteArray(); 

      // Render twice 
      FopFactory fopFactory = FopFactory.newInstance(); 
      FOUserAgent uaPDF = fopFactory.newFOUserAgent(); 
      FOUserAgent uaJpg = fopFactory.newFOUserAgent(); 

      Fop fopPDF = fopFactory.newFop(MimeConstants.MIME_PDF, uaPDF, pdfOut); 
      Fop fopJpg = fopFactory.newFop(MimeConstants.MIME_JPEG, uaJpg, jpgOut); 

      //PDF 
      Source src = new StreamSource(new ByteArrayInputStream(foBytes)); 
      Transformer resultTransformer = factory.newTransformer(); 
      resultTransformer.transform(src, new SAXResult(fopPDF.getDefaultHandler())); 

      //JPF 
      src = new StreamSource(new ByteArrayInputStream(foBytes)); 
      resultTransformer = factory.newTransformer(); 
      resultTransformer.transform(src, new SAXResult(fopJpg.getDefaultHandler())); 
     } 

희망 미안 해요

+0

을하는 데 도움이, 내 코드 약간 흐릿한. 내가하고있는 일은 XML에 xsl-fo 마크 업을 적용하고 pdf에 출력을 렌더링하는 것이다. xml-xsl-fo 변환은 없습니다. –

+0

Eugene, 코드에서 XML에 xsl-fo 마크 업을 적용하는 것은 * xslt 변환입니다. 최종 형식 (PDF) 단계에 xsl-fo 연결됩니다. 여러 대상 형식이있는 경우 해당 체인을 끊고 첫 번째 부분을 한 번만 수행하십시오. – stwissel

+0

자, 무슨 뜻인지 알았어, 고마워! 또한 Apache FOP 중간 형식 기능 http://xmlgraphics.apache.org/fop/1.1/intermediate.html (IF 하나)이 나에게 적합하다고 생각합니다. IF 파일을 렌더링 한 다음 해당 IF 파일에서 원하는 것을 렌더링합니다. –