HTML コードを含む Java String から PDF ドキュメントを生成しようとしています。「Freemarker」をテンプレートエンジンとして使用してhtmlコンテンツを生成し、「Flying-Saucer」を使用してこの生成されたhtmlをpdfに変換しています。私の問題は、生成された pdf で画像がレンダリングされないことです。私がどのように生成しているかについての正確な詳細は次のとおりです。
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 にデプロイされた War として実行されます。ツリー コマンド (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