iTextSharp 使用 PdfContentByte 和 ColumnText 显示 'error'
iTextSharp display 'error' using PdfContentByte and ColumnText
我正在尝试使用 PdfContentByte 和 ColumnText 来显示从客户订单导入的注释。文档和注释显示正确,但是,当我在文档中完全向下滚动时,我收到一条错误消息 "An error exists on this page. Acrobat may not display the page correctly. Please contact the person who created the PDF document to correct the problem"
我环顾四周,找到了如下答案: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 正确显示。
您正在创建非法的 PDF 语法。通过引入 BT
(begin text)和 ET
(end text)运算符创建文本对象。使用 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
,一个隐藏所有低级操作的class:
var ct = new ColumnText(dc);
ct.SetSimpleColumn(notesDisplay, 55f, 0f, 400f, _verticalAlign, 10f, Element.ALIGN_LEFT);
ct.Go();
由于不明原因,您混合了这两种方法,创建的代码很难理解、维护和调试。请删除所有使用 dc
变量的行,但使用 dc
作为参数创建 ColumnText
对象的行除外。
我正在尝试使用 PdfContentByte 和 ColumnText 来显示从客户订单导入的注释。文档和注释显示正确,但是,当我在文档中完全向下滚动时,我收到一条错误消息 "An error exists on this page. Acrobat may not display the page correctly. Please contact the person who created the PDF document to correct the problem" 我环顾四周,找到了如下答案: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 正确显示。
您正在创建非法的 PDF 语法。通过引入 BT
(begin text)和 ET
(end text)运算符创建文本对象。使用 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
,一个隐藏所有低级操作的class:
var ct = new ColumnText(dc);
ct.SetSimpleColumn(notesDisplay, 55f, 0f, 400f, _verticalAlign, 10f, Element.ALIGN_LEFT);
ct.Go();
由于不明原因,您混合了这两种方法,创建的代码很难理解、维护和调试。请删除所有使用 dc
变量的行,但使用 dc
作为参数创建 ColumnText
对象的行除外。