iTextSharp显示'错误'使用PdfContentByte和ColumnText

时间:2015-05-05 18:53:03

标签: c# pdf itextsharp

我尝试使用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正确显示。

1 个答案:

答案 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对象的行除外。