使用 itextsharp 生成的 PDF 在第一次打印命令时给出错误

Van*_*ana 1 pdf adobe pdf-generation itext

我第一次给出打印命令。

“此页面存在错误。Acrobat 可能无法正确显示该页面。请联系创建 pdf 文档的人员以更正问题”。

打印输出非常好。第二次打印命令没有给出任何错误。

请帮助我为什么第一次打印时会出现此错误。

这是我创建 PDF 的代码的一部分

PdfContentByte cb = writer.DirectContent;
cb.BeginText();
Font NormalFont = FontFactory.GetFont("Arial", 12, Font.NORMAL, Color.BLACK);
// Add an image to a fixed position 
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(Server.MapPath("~/images/images/banner.tiff"));
img.SetAbsolutePosition(35, 760);
img.ScalePercent(50);
cb.AddImage(img);
// Draw a line by setting the line width and position
cb.SetLineWidth(2);
cb.MoveTo(20, 740);
cb.LineTo(570, 740);
cb.Stroke();
//Header Details
cb.BeginText();
writeText(cb, drHead["EmpName"].ToString(), 25, 745, f_cb, 14);
writeText(cb, "Employee ID:", 450, 745, f_cn, 12);
writeText(cb, drHead["EmployeeID"].ToString(), 515, 745, f_cb, 12);
cb.EndText();
cb.BeginText();
writeText(cb, "XXXX:", 25, 725, f_cb, 8);
cb.EndText();
cb.SetLineWidth(2);
cb.MoveTo(20, 675);
cb.LineTo(570, 675);
cb.Stroke();
cb.EndText();
// Acknowledgement section
cb.BeginText();
writeText(cb, "XXXXXXXXXXXXXXXX", 20, 140, f_cb, 12);
cb.EndText();
cb.EndText();
Run Code Online (Sandbox Code Playgroud)

请帮我知道是什么问题。

Bru*_*gie 5

您有嵌套的文本块。这是非法的 PDF 语法。我认为 iTextSharp 的最新版本会警告您这一点,所以我猜您正在使用旧版本。

这是错误的:

cb.BeginText();
...
cb.BeginText();
...
cb.EndText();
...
cb.EndText();
Run Code Online (Sandbox Code Playgroud)

这是对的:

cb.BeginText();
...
cb.EndText();
...
cb.BeginText();
...
cb.EndText();
Run Code Online (Sandbox Code Playgroud)

此外:ISO-32000-1 告诉您在文本块内禁止某些操作。

这是错误的:

cb.BeginText();
...
cb.AddImage(img);
...
cb.EndText();
Run Code Online (Sandbox Code Playgroud)

这是对的:

cb.BeginText();
...
cb.EndText();
...
cb.AddImage(img);
Run Code Online (Sandbox Code Playgroud)

最后,在创建文本块时,一些运算符是必需的。例如:你总是需要setFontAndSize()(我不知道你在做什么writeText(),但我假设你正确设置了字体)。

无论如何:您选择在最低级别使用 iTextSharp,几乎手动编写 PDF 语法。这假设您对 ISO-32000-1 了如指掌。如果不这样做,您应该使用一些高级对象,例如ColumnText将内容放置在绝对位置。