2012-04-28 167 views
1

我想從包含html代碼的Java字符串中生成一個pdf文檔。我使用「Freemarker」作爲模板引擎來生成html 內容,然後使用「Flying-Saucer」將此生成的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> 

此代碼運行作爲部署在Tomcat的一個時期。在戰爭中的圖像以 樹命令(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 

我已經截斷了簡潔的輸出。請幫忙。

感謝和問候, 羅希特

回答

0

一個可能的問題可能是你使用相對URL的HTML代碼。嘗試使用絕對URL,而不是相對。

1

嘗試設置baseUrl參數。

我有同樣的問題 - 我通過HTML並沒有在PDF中獲取圖像(或CSS)。我用的是同樣的事情,你:

renderer.setDocumentFromString(html); 

這種方法也可以採取基本的URL參數:

renderer.setDocumentFromString(content, baseUrl) 

其中的baseUrl =根文件夾(在我的情況下,它是一個Web應用程序,所以它是'http:// server:port/app')。它似乎像基礎href一樣工作 - 在baseUrl上構建相對路徑。一旦我添加,blammo - 圖像和CSS。