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

时间:2014-01-23 07:02:43

标签: pdf adobe pdf-generation itextsharp

第一次发出打印命令时,我正在下面。

“此页面上存在错误.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();

请帮我弄清楚是什么问题。

1 个答案:

答案 0 :(得分:4)

您有嵌套的文本块。这是非法的PDF语法。我想最近版本的iTextSharp会对此发出警告,所以我猜你使用的是旧版本。

这是错误的:

cb.BeginText();
...
cb.BeginText();
...
cb.EndText();
...
cb.EndText();

这是对的:

cb.BeginText();
...
cb.EndText();
...
cb.BeginText();
...
cb.EndText();

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

这是错误的:

cb.BeginText();
...
cb.AddImage(img);
...
cb.EndText();

这是对的:

cb.BeginText();
...
cb.EndText();
...
cb.AddImage(img);

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

无论如何:您选择在最低级别使用iTextSharp,几乎手动编写PDF语法。这假定您从内到外了解ISO-32000-1。如果不这样做,则应使用某些高级对象(例如ColumnText)将内容定位在绝对位置。