Распечатать изображение в формате PDF с помощью летающей тарелки

Распечатайте изображение в формате PDF с помощью «Летающей тарелки».

HTML-код:

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

Когда я конвертирую HTML в PDF с помощью Flying Saucer. Сгенерированный 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. Пожалуйста, дай мне знать, если возникнут какие-либо вопросы.


person john will    schedule 16.02.2016    source источник


Ответы (2)


Вам нужно установить контекст и относительный путь для вашего изображения,

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> 
person Avinash Singh    schedule 03.03.2016

Чтобы встроить изображение в PDF-файл, созданный Flying Saucer,

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)

Теперь у вас есть byteArrayOutputStream сгенерированного PDF-файла, с помощью которого вы можете сохранить их на файловом сервере или передать клиенту в выбранном вами формате.

person sangeethapradeep    schedule 07.03.2020
comment
Обратите внимание, что поскольку летающая тарелка переключилась на java.util.Base64 вместо javax.xml.bind.DatatypeConverter в версии 9.1.20, тег data:image/png;base64, больше не отображается, если строка данных начинается с ведущего пробела. - person Michael; 04.11.2020