2012-04-28 8 views
1

htmlの コードを含むJava Stringからpdfドキュメントを生成しようとしています。私はテンプレートエンジンとして "Freemarker"を使用して、 のコンテンツを生成し、次にこの生成されたHTMLをpdfに変換する "Flying-Saucer"を使用しています。 私の問題は、画像が生成された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内で実行) treeコマンドの出力として、戦争中の画像の場所は次のとおりです。

|-- 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

は、可能な問題は、相対URLのhtmlコードでの使用をすることができます。相対URLの代わりに絶対URLを使用してみてください。

1

baseUrlパラメータを設定してみてください。

私は同じ問題を抱えていました。私はHTMLで渡していますが、pdfに画像(またはその問題についてはCSS)が表示されていませんでした。私はあなたとまったく同じものを使用:

renderer.setDocumentFromString(html); 

方法は、ベースURLパラメータを取ることができること:

baseUrlには、ルートフォルダを=
renderer.setDocumentFromString(content, baseUrl) 

(私の場合には、それはWebアプリケーションなので、それ「http:// server:port/app」)。それはベースhref相対パスがbaseUrl上に構築されているように動作するようです。私がそれを追加すると、blammo - imagesとcss。

関連する問題