itext将文本添加到页面结果当前但不可见的文本 - 字体缺失?

时间:2014-03-12 08:27:18

标签: java pdf itext

我正在尝试使用以下代码在pdf上添加自定义文本。

在大多数情况下都可以正常工作,但是对于某些pdf(主要是扫描图像),文本显示为“不可见”:我可以选择并复制文本,但就像它的不透明度= 0。

        PdfReader pdfTemplate = new PdfReader(is);
        final PdfStamper stamper = PdfAStamper.createSignature(pdfTemplate, os, '\0');
        PdfContentByte content = stamper.getUnderContent(pageNumber);
        ColumnText ct = new ColumnText(content);
        ct.setSimpleColumn(llx, lly, urx, uly, 0, Element.ALIGN_CENTER);
        Font headerFont = new Font(Font.FontFamily.COURRIER, 7, Font.NORMAL);
        headerFont.setColor(BaseColor.BLACK);
        Chunk c = new Chunk("hello", headerFont);
        Paragraph p = new Paragraph(c);
        p.setAlignment(Element.ALIGN_CENTER);
        ct.addElement(p);
        ct.go();

我想知道pdf是否缺少字体。运行pdffont "mypdf.pdf"会返回错误:

Syntax Warning: May not be a PDF file (continuing anyway)
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't read xref table

在我的代码中添加pdfTemplate.createFakeFontSubsets()会产生以下结果:

name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
Times-Roman                          Type 1            WinAnsi          no  no  no      1  0

我猜这个字体没有嵌入,但以下内容也不起作用:

BaseFont courrier = BaseFont.createFont("courrier", BaseFont.CP1252, BaseFont.EMBEDDED);
Font headerFont = new Font(courrier, 7, Font.NORMAL);  

您是否知道发生了什么,以及如何修复我的代码以使其适用于各种pdf,包括扫描的PDF格式?

(不幸的是,给我一个pdf示例对我来说有点复杂,因为它发生在客户文档上......)

1 个答案:

答案 0 :(得分:1)

这条线是罪魁祸首:

PdfContentByte content = stamper.getUnderContent(pageNumber);

您正在现有内容中添加文字。由于现有内容由不透明图像组成,因此文本存在,但由白色像素覆盖。

将该行更改为:

PdfContentByte content = stamper.getOverContent(pageNumber);

你的问题将得到解决。

如果您不想完全覆盖现有内容,可能需要使文本略微透明。