Почему шрифт не внедряется в PDF с использованием потока контента раньше в Itext7? - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь добавить текст водяного знака со шрифтом Helvitica в простой PDF-файл, используя один из примеров, представленных на сайте примеров IText (https://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-watermark-examples),, но по какой-то причине PDF-файл неправильно показывает шрифт в PDF.

Я посмотрел шрифты свойства pdf, и кажется, что шрифт не встроен в PDF.

Pdf with font property

Я использую версию itext 7.0.8.

Я что-то здесь не так делаю.

Мой код:

import java.io.FileNotFoundException;
import java.io.IOException;
import com.itextpdf.io.font.FontConstants;
import com.itextpdf.io.font.FontProgramFactory;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfResources;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;

public class AddTextToPDF {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader("c:\\Development\\test.pdf"),
                new PdfWriter("c:\\Development\\test_result.pdf"));
        PdfCanvas under = new PdfCanvas(pdfDoc.getFirstPage().newContentStreamBefore(), new PdfResources(), pdfDoc);
        PdfFont font = PdfFontFactory.createFont(FontProgramFactory.createFont(FontConstants.HELVETICA));
        Paragraph p = new Paragraph("This watermark is added UNDER the existing content")
                .setFont(font).setFontSize(15);
        new Canvas(under, pdfDoc, pdfDoc.getDefaultPageSize())
                .showTextAligned(p, 297, 550, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        pdfDoc.close();
    }
}

Если я изменю строку:

PdfCanvas under = new PdfCanvas(pdfDoc.getFirstPage().newContentStreamBefore(), new PdfResources(), pdfDoc);

К

PdfCanvas over = new PdfCanvas(pdfDoc.getFirstPage());

шрифт внедряется в PDF.

1 Ответ

0 голосов
/ 10 ноября 2018

Как вы узнали сами, проблема связана с этой строкой:

PdfCanvas under = new PdfCanvas(pdfDoc.getFirstPage().newContentStreamBefore(), new PdfResources(), pdfDoc);

Проблема в том, что вы используете здесь объект new PdfResources(), который в дальнейшем ни для чего не используется.

Объект ресурсов, который вы предоставляете в этом конструкторе PdfCanvas, - это место, где помещаются новые ресурсы, необходимые для того, что вы рисуете на холсте, например, новые шрифтовые ресурсы.

Таким образом, в вашем случае новый шрифт добавляется к новому объекту ресурсов, который затем нигде не добавляется и поэтому не попадает в окончательный PDF-файл вообще. Таким образом, шрифт потерян.

Чтобы исправить это, используйте ресурсы страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...