【问题标题】:PDFs generated with iTextSharp generated watermark giving error使用 iTextSharp 生成的 PDF 生成的水印给出错误
【发布时间】:2018-05-31 23:08:24
【问题描述】:

在将 PDF 文档传递给客户端之前,我们正在使用 iTextSharp 将水印应用于 PDF 文档。在某些机器上(全部使用 v.11 的 PDF 查看器),显示以下错误。

此页面存在错误。 Acrobat 可能无法正确显示页面。请联系创建 PDF 文档的人员以解决问题。

水印代码如下:

protected static byte[] GetStampedDocument(byte[] content, string mark, string heading)
    {
        PdfReader reader = new PdfReader(content);
        using (MemoryStream stream = new MemoryStream())
        {
            PdfStamper pdfStamper = new PdfStamper(reader, stream);

            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                iTextSharp.text.Rectangle pageSize = reader.GetPageSizeWithRotation(i);

                PdfContentByte pdfPageContents = pdfStamper.GetOverContent(i);
                pdfPageContents.BeginText(); 

                PdfGState gstate = new PdfGState();
                gstate.FillOpacity = 0.2f;
                gstate.StrokeOpacity = 0.3f;

                pdfPageContents.SaveState();
                pdfPageContents.SetGState(gstate);

                BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, Encoding.ASCII.EncodingName, false);
                pdfPageContents.SetFontAndSize(baseFont, 46);
                pdfPageContents.SetRGBColorFill(32, 32, 32);

                pdfPageContents.ShowTextAligned(PdfContentByte.ALIGN_CENTER, mark, pageSize.Width / 2, pageSize.Height / 2, 66);

                if (heading != null && heading.Length > 0)
                {
                    pdfPageContents.SetFontAndSize(baseFont, 12);
                    pdfPageContents.SetRGBColorFill(32, 32, 32); 
                    pdfPageContents.ShowTextAligned(PdfContentByte.ALIGN_LEFT, heading, 5, pageSize.Height - 15, 0);
                }

                pdfPageContents.EndText();
                pdfPageContents.RestoreState();
            }

            pdfStamper.FormFlattening = true; 
            pdfStamper.FreeTextFlattening = true; 
            pdfStamper.Close(); 
            return stream.ToArray();
        }
    }

我无法在我尝试过的任何机器上重新创建它,所以我期望这也有一个环境元素。

有什么想法吗?

【问题讨论】:

    标签: pdf itext pdf-generation


    【解决方案1】:

    您将图形状态保存在文本对象中:

    pdfPageContents.BeginText(); 
    [...]
    pdfPageContents.SaveState();
    [...]
    pdfPageContents.EndText();
    pdfPageContents.RestoreState();
    

    这是不允许的,参见。图 9 — 图形对象 — 在 ISO 32000-2 中,不能在文本对象中使用特殊的图形状态操作符(如保存或恢复图形状态)。

    为防止出现这种无效语法,请将pdfPageContents.SaveState() 移到pdfPageContents.BeginText() 之前。这进一步使得保存/恢复状态以及开始和结束文本对象的嵌套更加自然。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多