为什么以前在Itext7中没有使用内容流将字体嵌入到PDF中?

时间:2018-11-09 17:06:35

标签: java watermark itext7

我正在尝试使用IText示例网站(Hot/Cold Flame Graphs)中提供的示例之一,将字体为Helvitica的水印文本添加到简单的PDF中,但是由于某些原因,PDF无法在Windows中正确显示字体PDF。

我查看了pdf属性字体,似乎该字体未嵌入到PDF中。

https://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-watermark-examples

我正在使用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 :(得分:2)

发现自己后,问题与以下行有关:

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

问题是您在此处使用了new PdfResources()对象,此对象以后将不再使用。

在此PdfCanvas构造函数中提供的资源对象是放置在画布上所需的新资源的地方,例如新字体资源。

因此,在您的情况下,新字体将添加到新的资源对象中,然后再无处添加,因此最终不会出现在最终的pdf中。因此字体丢失了。

要解决此问题,请改用页面资源。