我尝试使用PdfContentByte和ColumnText来显示从客户订单导入的注释。文档和注释正确显示但是,当我在文档中向下滚动时,我收到错误说"此页面上存在错误。 Acrobat可能无法正确显示页面。请联系创建PDF文档的人员以解决问题" 我环顾四周,找到了答案:PDFs generated using itextsharp giving error at the time of first print command 但该方法似乎没有任何嵌套问题:
private void DisplayNotes(OrderVerificationData ovNotes)
{
_notes = ovNotes.orderNotes;
_resultNotes = _notes.Split(_notesSeparators, StringSplitOptions.RemoveEmptyEntries);
Phrase notesDisplay = FormatPhrase("");
PdfContentByte dc = _instance.DirectContent;
var ct = new ColumnText(dc);
foreach (string t in _resultNotes)
{
notesDisplay.Add(t);
notesDisplay.Add(Environment.NewLine);
}
dc.BeginText();
dc.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false), 10f);
dc.SetTextMatrix(50f, _verticalAlign);
if (_verticalAlign <= 40)//new page stuff, error still occurs when commented out
{
dc.EndText();
FooterCreation(ovNotes);
_document.NewPage();
_numberOfPages += 1;
_verticalAlign = 690;
dc.BeginText();
dc.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false), 9f);
dc.SetTextMatrix(50f, _verticalAlign);
}
ct.SetSimpleColumn(notesDisplay, 55f, 0f, 400f, _verticalAlign, 10f, Element.ALIGN_LEFT);
ct.Go();
dc.EndText();
}
我不记得需要关闭的专栏文本,我也找不到任何必须关闭的内容。是否还有其他因素导致此问题? 从文件的其余部分删除此方法的所有用法会导致pdf正确显示。
答案 0 :(得分:2)
您正在创建非法的PDF语法。通过引入BT
(开始文本)和ET
(结束文本)运算符来创建文本对象。使用iTextSharp引入这些运算符有不同的方法。
一种方法是使用低级语法添加这些运算符:
dc.BeginText();
dc.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false), 10f);
dc.SetTextMatrix(50f, _verticalAlign);
dc.ShowText("Some text");
dc.EndText();
另一种方法是使用ColumnText
,这是一个隐藏所有低级操作的类:
var ct = new ColumnText(dc);
ct.SetSimpleColumn(notesDisplay, 55f, 0f, 400f, _verticalAlign, 10f, Element.ALIGN_LEFT);
ct.Go();
由于未知的原因,您正在混合使用这两种方法,创建非常难以理解,维护和调试的代码。请删除使用dc
变量的所有行,但使用dc
作为参数创建ColumnText
对象的行除外。