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

使用iTextSharp生成的水印生成的PDF给出错误,pdf,itext,pdf-generation,Pdf,Itext,Pdf Generation,在将PDF文档传递给客户之前,我们正在使用iTextSharp对其应用水印。在某些机器上(均使用PDF viewer的v.11),显示以下错误 此页面上存在错误。Acrobat可能无法正确显示页面。请与创建PDF文档的人员联系以更正问题。 水印代码如下所示: protected static byte[] GetStampedDocument(byte[] content, string mark, string heading) { PdfReader reader =

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

此页面上存在错误。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();
        }
    }
受保护的静态字节[]GetStampedDocument(字节[]内容、字符串标记、字符串标题)
{
PDF阅读器=新的PDF阅读器(内容);
使用(MemoryStream stream=new MemoryStream())
{
PdfStamper PdfStamper=新的PdfStamper(读卡器、流);
对于(int i=1;i 0)
{
SetFontAndSize(baseFont,12);
SetRGBColorFill(32,32,32);
pdfPageContents.ShowTextAligned(PdfContentByte.ALIGN_LEFT,heading,5,pageSize.Height-15,0);
}
pdfPageContents.EndText();
pdfPageContents.RestoreState();
}
pdfStamper.formflatting=true;
pdfStamper.freetextflatting=true;
pdfStamper.Close();
返回流ToArray();
}
}
我无法在我尝试过的任何机器上重新创建它,所以我希望这也有一个环境因素


有什么想法吗

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

pdfPageContents.BeginText(); 
[...]
pdfPageContents.SaveState();
[...]
pdfPageContents.EndText();
pdfPageContents.RestoreState();
这是不允许的,参见图9-图形对象-在ISO 32000-2中,特殊图形状态运算符(如保存或恢复图形状态)不得在文本对象内使用


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

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

pdfPageContents.BeginText(); 
[...]
pdfPageContents.SaveState();
[...]
pdfPageContents.EndText();
pdfPageContents.RestoreState();
这是不允许的,参见图9-图形对象-在ISO 32000-2中,特殊图形状态运算符(如保存或恢复图形状态)不得在文本对象内使用

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