2012-03-14 2 views
2

다음은 현재 워크 플로입니다.생성 된 XHTML 문서를 사용할 때 URL 확인자 디렉토리를 설정 하시겠습니까?

  1. 데이터베이스에서 POJO를로드하십시오.
  2. Velocity로 전달하여 HTML 템플릿을 메모리에 렌더링합니다.
  3. 그런 다음 Flying Saucer 및 iText를 사용하여 출력 된 HTML을 PDF로 렌더링하십시오.

이미지와 같은 상대 URL을 확인하려고하면 문제가 발생합니다. 내 문서가 메모리에 있기 때문에 이미지 나 스타일 시트를 해결하는 방법을 모릅니다. 어떻게 리소스를로드 할 디렉토리를 전달하면서 메모리 내 String 객체에 문서를 설정할 수 있습니까?

String velocityOutput = VelocityEngineUtils.mergeTemplateIntoString(...); 

ByteArrayOutputStream output = new ByteArrayOutputStream(...); 

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocumentFromString(velocityOutput); 
renderer.layout(); 
renderer.createPDF(output); 

단순히 클라이언트에 전자 메일로 보낼 보고서를 생성하기 때문에 모든 메모리를 필요로합니다. <img src="..."/>을 HTML 템플릿에서 PDF로 생성 할 때 상대 URL을 확인하도록하려면 어떻게해야합니까?

답변

1

:

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder() 
       .parse(new ByteArrayInputStream(templateOutput.getBytes("UTF-8"))); 

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(document, templateResourceDirectory); 
    renderer.layout(); 

OutputStream result = new ByteArrayOutputStream(); 

renderer.createPDF(result); 

한 가지는 특히 조심해야는 사실이다 Flying Saucer는 파일 기반 URI 앞에 file://이라는 접두사가 있어야하며 제대로 작동하려면 파일 경로 끝에 슬래시가 있어야합니다.

/var/www/cache   # FAIL 
file:///var/www/cache # ALSO FAIL 
file:///var/www/cache/ # WIN 
2

당신은 UserAgentCallback 인터페이스를 구현하고 자바 독에서 renderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);

로 설정해야합니다 :이 경우

사용자 에이전트는 외부 리소스를 검색 할 책임이있다.

자신의 UAC를 만드는 방법을 이해하려면 {@link org.xhtmlrenderer.swing.NaiveUserAgent}와 같이 라이브러리와 함께 제공되는 구현의 일부를 보는 것이 가장 좋습니다. 나는 단순히 하나의 호출에 자원 디렉토리와 비행 접시로 전송 다음 자바 Document 인스턴스에 내 문서를로드하고 결국