2012-04-28 3 views
1

html 코드가 포함 된 Java String에서 pdf 문서를 생성하려고합니다. 나는 템플릿을 엔진으로 "freemarker"를 사용하여 내용을 생성 한 다음 "비행 접시"를 생성하여이 HTML을 pdf로 변환합니다. 내 문제는 이미지가 제작 된 PDF에서 렌더링되지 않는다는 것입니다. 다음과 같이 내가 생성하고 방법에 대한 정확한 세부 사항은 다음과 같습니다Flying-Saucer/iText를 사용한 이미지 렌더링

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.Writer; 
import java.util.List; 

import org.xhtmlrenderer.pdf.ITextRenderer; 

import com.google.inject.Inject; 
import com.google.inject.Singleton; 
import com.lowagie.text.DocumentException; 

import freemarker.template.Configuration; 
import freemarker.template.DefaultObjectWrapper; 
import freemarker.template.SimpleHash; 
import freemarker.template.SimpleSequence; 
import freemarker.template.Template; 
import freemarker.template.TemplateException; 

@Singleton 
public class FlyingSaucerTaxInvoicePdfPrinter implements ITaxInvoicePdfPrinter { 
    private final Configuration m_cfg; 

    @Inject 
    public FlyingSaucerTaxInvoicePdfPrinter() { 
     // TODO: Following should be singletons and injected 
     m_cfg = new Configuration(); 
     m_cfg.setObjectWrapper(new DefaultObjectWrapper()); 
     m_cfg.setClassForTemplateLoading(this.getClass(), "/"); 
    } 

    private Template getTemplate() throws IOException { 
     return m_cfg.getTemplate(PdfResources.TAX_INVOICE_TEMPLATE); 
    } 

    @Override 
    public void printToPdf(TaxInvoiceUiPb taxInvoice, OutputStream pdfOutputStream) { 
     OutputStream htmlOuputStream = null; 
     try { 
      htmlOuputStream = new ByteArrayOutputStream(); 
      printHtml(htmlOuputStream, taxInvoice); 
      generatePDF(htmlOuputStream, pdfOutputStream); 
     } catch (Exception e) { 
      throw new LoggedRuntimeException(e); 
     } finally { 
      try { 
       htmlOuputStream.close(); 
      } catch (IOException e) { 
       throw new LoggedRuntimeException(e); 
      } 
     } 
    } 

    private void generatePDF(OutputStream htmlOuputStream, OutputStream pdfOutputStream) 
        throws DocumentException, IOException { 
     try { 
      ITextRenderer renderer = new ITextRenderer(30.666f, 20); 
      String html = htmlOuputStream.toString(); 
      logHtml(html); 
      renderer.setDocumentFromString(html); 
      renderer.layout(); 
      renderer.createPDF(pdfOutputStream); 
     } finally { 
      pdfOutputStream.close(); 
     } 
    } 

// Some methods not shown as irrelevant 
} 

(단지 관련 섹션을 보여주는) 생성 된 HTML은 다음과 같습니다

<body> 
<div class="main" background="images/invoice-bg.jpg"> 
    <img src="images/invoice-bg.jpg"></img> 
    <div class="header"> 
    <div class="logo"><img src="images/invoice-logo.jpg" alt="" border="0" /></div> 
    <div class="heading">booking invoice</div> 
    </div> 
    <div class="clear"></div> 
</div> 
</body> 

이 코드는 톰캣에 배포 된 전쟁으로 실행됩니다. (WEB-INF 내에서 실행) 트리 명령의 출력으로 전쟁에서 이미지의 위치는 다음과 같습니다 나는 간결에 대한 출력을 절단 한

|-- classes 
| |-- com 
| | `-- ilodge 
| |  `-- pmsServerWar 
| |   |-- PmsServerWarListener.class 
| |   `-- PmsServerWarServletModule.class 
| |-- images 
| | |-- invoice-bg.jpg 
| | |-- rupees-icon-total.png 
| | |-- thank-you.jpg 
| | |-- total-bold-rupee.png 
| | `-- ul-bor.jpg 
| |-- taxInvoice.css 
| |-- taxInvoiceFooter.ftl 
| |-- taxInvoice.ftl 
| `-- test.ftl 
|-- lib 
| |-- addressServer-1.0-SNAPSHOT.jar 
| |-- addressUiProtobuf-1.0-SNAPSHOT.jar 
| `-- xml-apis-1.3.03.jar 
`-- web.xml 

. 도와주세요.

감사와 관련, Rohit

답변

0

이 가능한 문제는 HTML 코드에서 상대 URL의 사용을 할 수 있습니다. 절대 URL 대신 상대 URL을 사용하십시오.

1

baseUrl 매개 변수를 설정해보십시오.

나는 동일한 문제가있다 - 나는 html로 전달하고있어 pdf에서 이미지 (또는 그 문제에 대한 CSS)를 얻지 못했다. 난 당신과 정확히 같은 일을 사용 :

renderer.setDocumentFromString(html); 

방법은 또한 기본 URL 매개 변수를 취할 수 :

base을이 웹 응용 프로그램의 내 경우 루트 폴더 (=
renderer.setDocumentFromString(content, baseUrl) 

, 그것 때문에 'http : // server : port/app'). baseUrl 기반 href 상대 경로 빌드처럼 작동하는 것 같습니다. 일단 내가 그것에 blammo - 이미지와 CSS를 추가했습니다.