使用飞碟打印PDF图像

时间:2016-02-16 22:19:56

标签: html css itext flying-saucer html-to-pdf

使用飞碟以PDF格式打印图像。

HTML code:

<?xml version="1.0" encoding="utf-8" ?>
<html>
    <p>
        <img src="Smallcheck.jpg" width="20" height="21"/>
    </p>
</html> 

当我使用Flying Saucer将HTML转换为PDF时。生成的PDF不会打印图像。

var outputForPdfStream = new this.ByteArrayOutputStream();

// tidy the html
var domdoc =  this.domDocument;
var iTidy = new this.tidy();
iTidy.setShowWarnings(false);
iTidy.setXmlTags(false);
iTidy.setInputEncoding("UTF-8");
iTidy.setOutputEncoding("UTF-8");
iTidy.setXHTML(true);//
iTidy.setMakeClean(true);
domdoc = iTidy.parseDOM(inputStream, outputForPdfStream);

// Convert the document to XHTML panel and then rendering it into a PDF
var xhtmlPanel = new this.XHTMLPanel();
xhtmlPanel.setDocument(domdoc);

var renderer = new this.iTextRenderer();
renderer.setDocument(xhtmlPanel.getDocument(), null);
renderer.layout();
renderer.createPDF(bos);
bos.flush();
inputStream.close();
this.debug("INPUT STREAM" + inputStream);

var byteArray = bos.toByteArray();
var encodedString  = this.StringUtil.base64Encode(byteArray);
this.debug("Encoded String" + encodedString);

我是否需要使用任何特定包以PDF格式打印图像。如果您有任何问题,请与我们联系。

2 个答案:

答案 0 :(得分:0)

您需要设置图像的上下文和相对路径,

renderer.setDocument(xhtmlPanel.getDocument(), null);

应该改为,

renderer.setDocument(xhtmlPanel.getDocument(), "http:\\mywebsite:8080\images");

你的图片应该在上下文中指定的文件夹下,你可以在src中使用图像的相对路径,

<?xml version="1.0" encoding="utf-8" ?>
<html>
    <p>
        <img src="check/Smallcheck.jpg" width="20" height="21"/>
    </p>
</html> 

答案 1 :(得分:0)

为了将图像嵌入到飞碟生成的PDF中,

1)将图像转换为base64编码的字符串。

Path path = Paths.get("src/main/resources/static/images/mastercard.png");
String base64Image = convertToBase64(path);

将存储在上述路径中的图像转换为以base64编码的字符串的功能

private String convertToBase64(Path path) {
    byte[] imageAsBytes = new byte[0];
    try {
      Resource resource = new UrlResource(path.toUri());
      InputStream inputStream = resource.getInputStream();
      imageAsBytes = IOUtils.toByteArray(inputStream);

    } catch (IOException e) {
      System.out.println("\n File read Exception");
    }

    return Base64.getEncoder().encodeToString(imageAsBytes);
  }

2)在百里香上下文中设置base64编码的图像

    Context context = new Context();
    String image = "data:image/png;base64, " + base64Image;
    context.setVariable("image",  image);

    String html = templateEngine.process("template", context);

3)在HTML中,如下所示设置图片的值:

<img th:src="${image}" style="width: 200px; height=100px"/>

4)最后,将HTML模板呈现为PDF

  ITextRenderer renderer = new ITextRenderer();
  renderer.setDocumentFromString(html); // html -> String created in Step 2
  renderer.layout();
  final ByteArrayOutputStream baos = new ByteArrayOutputStream();
  renderer.createPDF(baos)

现在有了生成的PDF的byteArrayOutputStream,您可以选择将其存储到文件服务器或以您选择的格式提供给客户端。