Как масштабировать фоновое изображение с помощью iText7 и pdfHtml?

Я пытаюсь перейти на последнюю версию iText и у меня возникают проблемы. В настоящее время мы используем шаблоны Apache Velocity, а затем конвертируем полученный HTML в pdf с помощью iText.

У нас есть большое изображение (2220 x 3248), которое включено в PDF-файл в качестве фона. Я сократил шаблон до минимума.

<html>
<head>
  <style type="text/css">
    @page {
      margin-top:57px;
      margin-bottom:50px;
      margin-left: 110px;
      margin-right: 40px;
      padding-top:160px;
      padding-bottom:5px;
      background-image:url('templates/background.png');
      background-size:100% 100%;
      background-position:top left;
    }
  </style>
</head>
<body>

<h1>Background Image Test</h1>

</body>
</html>

Затем я использую следующий код для визуализации PDF-файла.

public void render(PdfRendererContext ctx) throws Exception {
  ConverterProperties properties = new ConverterProperties();
  PdfWriter writer = new PdfWriter((OutputStream) ctx.getOutput().getOutput());
  PdfDocument pdf = new PdfDocument(writer);
  properties.setBaseUri("path/to/files");
  HtmlConverter.convertToPdf((String) ctx.getInput().getInput(), pdf, properties);
}

Это преобразует PDF-файл, и я в основном получаю то, что хочу, но фоновое изображение больше не масштабируется. Изображение должно быть рамкой вокруг страницы с логотипом посередине, но, как вы можете видеть, изображение намного больше, чем вся страница.

Я пробовал изменить размер фона несколькими способами, но безуспешно. Есть ли способ масштабировать фоновое изображение, подобное тому, что мне нужно?

1 ответ

Решение

К сожалению, pdfHTML не поддерживает background-sizeСвойство CSS пока нет. Существует решение с постобработкой, которое вы можете использовать для добавления фоновых изображений в ваш PDF-документ с помощью iText Core. Таким образом, у вас не будет фоновых изображений, определенных в HTML, и вместо этого вы просто добавите их на этапе постобработки. Вот как выглядит код описанного подхода:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Converting to a memory stream to process the document in memory afterwards before flushing to disk
HtmlConverter.convertToPdf(htmlStream, baos);

PdfDocument pdfDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())),
        new PdfWriter(new File("C:/path/to/out.pdf")));
ImageData imageData = ImageDataFactory.create("C:/path/to/background.png");
// Page size of the output HTML document
Rectangle pageSize = PageSize.A4;
Image image = new Image(imageData).scaleAbsolute(pageSize.getWidth(), pageSize.getHeight());
for (int i = 1; i <= pdfDocument.getNumberOfPages(); i++) {
    PdfPage page = pdfDocument.getPage(i);
    // newContentStreamBefore just adds some content on the back layer, to be shown behind other content
    PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDocument);
    new Canvas(pdfCanvas, pdfDocument, pageSize).add(image);
}
pdfDocument.close();
Другие вопросы по тегам