我正在尝试使用以下代码在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示例对我来说有点复杂,因为它发生在客户文档上......)
答案 0 :(得分:1)
这条线是罪魁祸首:
PdfContentByte content = stamper.getUnderContent(pageNumber);
您正在现有内容中添加文字。由于现有内容由不透明图像组成,因此文本存在,但由白色像素覆盖。
将该行更改为:
PdfContentByte content = stamper.getOverContent(pageNumber);
你的问题将得到解决。
如果您不想完全覆盖现有内容,可能需要使文本略微透明。