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 语法。通过引入 BTbegin text)和 ETend 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 对象的行除外。