2012-03-15 8 views
2

코드 조각 나는 서블릿을 사용하여 클라이언트의 브라우저에서 PDF 파일을 렌더링 할 성공적으로 수 있어요 질문비행 - 접시/iText를 PDF 파일은

의 하단에 비행 - 접시 CSS 파일을 찾을 수 없습니다/iText. 그러나, 나는 스타일 시트를 PDF 렌더링에 포함시키는 방법을 이해할 수 없다.

내가 해봤

다음과 아무도 지금까지 일한 적이 있습니다.

  • getServletContext() getRealPath ("/ PDFservlet.css을")와 웹 루트 디렉토리에서 "PDFservlet.css"를 넣어
  • buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>") 및 웹 루트 디렉토리에 "PDFservlet.css"를 두는 것, 서블릿 클래스 파일이 있고 "classes"디렉토리 바로 아래에있는 디렉토리
  • href='\PDFservlet.css'을 제외하고 위와 동일하며 여러 위치에 "PDFservlet.css"넣기 내 웹 루트 디렉토리 아래

여기에서 시도해야 할 다른 사항과 PDF가 클라이언트 브라우저에서 렌더링 될 때이 CSS 시트를 인식하는 방법을 잘 모르겠습니다.

내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있습니까?

또한 PDF가 렌더링 된 후에 나는 java.io.IOException: Stream closed을 얻었으며 어디서 오는지 확실하지 않습니다.

로컬로 테스트 중이며 WebLogic Server 10.3.3을 테스트 중입니다. 대안으로 나를 위해 노력하고 있습니다 문자열에 서버 측 코드에서 CSS 파일의 내용을 읽기

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws javax.servlet.ServletException, java.io.IOException 
{ 
    resp.setContentType("application/pdf"); 

    StringBuffer buf = new StringBuffer(); 
    buf.append("<html>"); 

    // put in some style 
    buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>"); 

    // generate the rest of the HTML... 
    buf.append("<body>"); 
    buf.append(" <div id='container'>"); 
    buf.append("  <div id='check_num'>1000</div>"); 
    buf.append("  <div id='address'><b>Estate Of JAMES SMITH</b><br />35 Addison Avenue<br />New York, NY 00000<br />(123)456-7890</div>"); 
    buf.append("  <div id='date'><i>Date</i>&#160;<u>02/08/2012</u></div>"); 
    buf.append("  <div id='void_message'><b>VOID 180 DAYS FROM CHECK DATE</b></div>"); 
    buf.append("  <div id='pay_line_container'>"); 
    buf.append("   <div id='pay_line_message'><i>Pay To The Order Of:</i></div>"); 
    buf.append("   <div id='pay_line'></div>"); 
    buf.append("   <div id='pay_line_pay_to'>Richard Richards XXIII</div>"); 
    buf.append("   <div id='pay_line_amount'>$&#160;5.00</div>"); 
    buf.append("  </div>"); 
    buf.append("  <div id='pay_line2_container'>"); 
    buf.append("   <div id='pay_line2'></div>"); 
    buf.append("   <div id='pay_line2_amount_description'>Five and 00/100</div>"); 
    buf.append("   <div id='pay_line2_dollars'>DOLLARS</div>"); 
    buf.append("  </div>"); 
    buf.append("  <div id='void_stamp'><b>VOID</b></div>"); 
    buf.append("  <div id='for_line'><i>For:</i>&#160;<u>test</u></div>"); 
    buf.append("  <div id='bank_info'><b>TD BANKNORTH</b><br />MAINE</div>"); 
    buf.append("  <div id='signature_line'></div>"); 
    buf.append("  <div id='bank_numbers'><b>c1000c a123456789a 987654321c</b></div>"); 
    buf.append(" </div>"); 
    buf.append("</body>"); 
    buf.append("</html>"); 

    System.out.println(buf.toString()); 

    // parse our markup into an xml Document 
    try { 
     DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     Document doc = builder.parse(new StringBufferInputStream(buf.toString())); 
     ITextRenderer renderer = new ITextRenderer(); 
     renderer.setDocument(doc, null); 
     renderer.layout(); 
     OutputStream os = resp.getOutputStream(); 
     renderer.createPDF(os); 
     os.close(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

편집 I

는합니다 (readFile 방법에서 존 소총의 게시물의 기반으로한다 How do I create a Java string from the contents of a file?) :

buf.append("<head><style>"); 
buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8")); 
buf.append("</style></head>"); 

이 대안으로 OK의 접근 방식처럼 보이는가? 난 당신 중 일부는 잠시의 모든 한 번에 살펴 수 바라고 있어요

내가 iText를위한 대화방을 만든 II

편집. iText/flying-saucer에 대한 몇 가지 문제가있어 전문가 중 일부의 도움을 받아 쉽게 해결할 수 있다고 생각합니다. iText 문제를 해결할 수있는 도움이되는 자료를 게시 해주십시오. http://chat.stackoverflow.com/rooms/8945/itext

답변

1

서버 측의 CSS 파일을 String으로 읽는 것으로 결정했습니다.

readFile 방법) How do I create a Java string from the contents of a file?에서 존 소총의 게시물의 기반으로한다 :

buf.append("<head><style>"); 
buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8")); 
buf.append("</style></head>"); 
4

이 문제를 해결하기 위해 여러 가지 방법이 있습니다, 하나는 당신이다, 다른 사람은 다음과 같습니다

1 :의 URL을 설정 귀하의 문서. renderer.setDocument(doc, null); 두 번째 매개 변수는 기본 URL이며 리소스는 그와 관련된 위치에 있습니다.

예 :

당신의 문서가 <link href="my.css" ..
  • 는 CSS가 http://example.com/something/my.css
  • 에 위치하고있다
    • 당신은 renderer.setDocument(doc, "http://example.com/something/page.html");

    2를 호출해야 다음 UserAgentCallback 인터페이스를 구현하고 renderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);로 설정

  • +0

    "두 번째 매개 변수는 문서의 URL입니다."- 내 문서가 OutputStream에 렌더링되므로 어떤 내용인지 확실하지 않습니다. 바로 지금, 나는 OutputStream을 서블릿에서 iframe으로 돌려 보낸다. –

    +0

    Flying Saucer는 상대 URL 찾기를위한 기본 URL로 사용할 것을 알리고 있습니다. (이 정보로 내 대답을 업데이트했습니다) – Adam

    관련 문제