使用 iTextSharp 添加水印文本时,PAC 工具中出现 iText 7 警告

Posted

技术标签:

【中文标题】使用 iTextSharp 添加水印文本时,PAC 工具中出现 iText 7 警告【英文标题】:While adding watermark text using iTextSharp, iText 7 warnings in PAC tool 【发布时间】:2018-04-18 04:35:56 【问题描述】:

问题 1:iTextSharp 我使用 iTextsharp.Sample 代码将水印文本添加到 pdf,如下所示。当我通过 PAC 工具检查 PDF 可访问性时,我收到警告说“可能不恰当地使用 Span 结构元素”。

public void override OnEndPage(PdfWriter writer, Document document) 
            float fontSize = 80;
            float xPosition = 300;
            float yPosition = 400;
            float angle = 45;
            PdfContentByte under = writer.DirectContentUnder;
            BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
        Font f = new Font(baseFont, 80, Font.NORMAL, BaseColor.LIGHT_GRAY);
        Phrase phrse = new Phrase("TEXT",f);
            ColumnText.ShowTextAligned(under , Element.ALIGN_LEFT, phrase, 75, 680,0); 

        

谁能帮我解决这些警告?

问题 2:iText 7 我使用 iText 7 添加了 watermarkText。示例代码如下。

PdfGState gs1 = new PdfGState();
gs1.setFillOpacity(0.5f);
PdfCanvas canvas = new PdfCanvas(docEvent.getPage());
canvas.beginMarkedContentSequence(PdfName.ARTIFACT);
canvas.setExtGState(gs1);
new Canvas(canvas, pdfDoc, page.getPageSize())
                    .setFontColor(Color.LIGHT_GRAY)
                    .setFontSize(60)
                    .setFont(font)
                    .showTextAligned(new Paragraph("WATERMARK"), 298, 421, pdfDoc.getPageNumber(page),
                            TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
canvas.endMarkedContentSequence();

当我通过 PAC 工具检查 PDF 可访问性时,我收到错误“此 pdf 已损坏。无法使用”。我该如何解决这个错误?

【问题讨论】:

【参考方案1】:

您正在添加未标记的内容。这是不允许的。请阅读官方网站上的常见问题解答:How to add a page number in the header of a PDF/A Level A file? 它描述了相同的问题,并解释了如何将内容添加为工件。工件是不属于真实内容的部分内容,例如页码、页眉、页脚、水印……。

您正在添加这样的水印:

ColumnText.ShowTextAligned(under , Element.ALIGN_LEFT, phrase, 75, 680,0);

将此内容标记为工件,如下所示:

under.beginMarkedContentSequence(PdfName.ARTIFACT);
ColumnText.ShowTextAligned(under , Element.ALIGN_LEFT, phrase, 75, 680,0);
under.endMarkedContentSequence();

请注意,您仍在使用 iText 5。最面向未来的版本是 iText 7。iText 7 具有更好的 Tagged PDF 支持。关于标记 PDF 的部分在 ISO 32000-2(又名 PDF 2.0 标准)中完全重写。 iText 5 将不再支持 PDF 2.0。第一个支持 PDF 2.0 的版本是 iText 7.1。

如果您现在投资于 iText 5 开发,您可能必须在必须遵守 PDF 2.0 中定义的标记 PDF 规则的那一天重写所有代码。如果我是你,我现在就升级。

【讨论】:

以上是关于使用 iTextSharp 添加水印文本时,PAC 工具中出现 iText 7 警告的主要内容,如果未能解决你的问题,请参考以下文章

C#添加文字水印

使用iTextSharp生成的PDF生成水印给出错误

c# itextsharp PDF 创建每个页面上都有水印

使用 itextsharp 在现有 pdf 中插入文本

itextsharp 水印

使用 iTextSharp 将文本添加到内存流中的现有多页 PDF 文档