使用 iTextSharp 生成的 PDF 生成的水印给出错误
PDFs generated with iTextSharp generated watermark giving error
我们正在使用 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();
}
}
我无法在我尝试过的任何机器上重新创建它,所以我希望这也有一个环境因素。
有什么想法吗?
您将图形状态保存在文本对象中:
pdfPageContents.BeginText();
[...]
pdfPageContents.SaveState();
[...]
pdfPageContents.EndText();
pdfPageContents.RestoreState();
这是不允许的,比照。图 9 — 图形对象 — 在 ISO 32000-2 中,不得在文本对象内使用特殊图形状态运算符(如保存或恢复图形状态)。
为防止这种无效语法,将 pdfPageContents.SaveState()
移到 pdfPageContents.BeginText()
之前。这进一步使 saving/restoring 状态和文本对象的开始和结束的嵌套更加自然。
我们正在使用 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();
}
}
我无法在我尝试过的任何机器上重新创建它,所以我希望这也有一个环境因素。
有什么想法吗?
您将图形状态保存在文本对象中:
pdfPageContents.BeginText();
[...]
pdfPageContents.SaveState();
[...]
pdfPageContents.EndText();
pdfPageContents.RestoreState();
这是不允许的,比照。图 9 — 图形对象 — 在 ISO 32000-2 中,不得在文本对象内使用特殊图形状态运算符(如保存或恢复图形状态)。
为防止这种无效语法,将 pdfPageContents.SaveState()
移到 pdfPageContents.BeginText()
之前。这进一步使 saving/restoring 状态和文本对象的开始和结束的嵌套更加自然。