【问题标题】:iTextSharp display 'error' using PdfContentByte and ColumnTextiTextSharp 使用 PdfContentByte 和 ColumnText 显示“错误”
【发布时间】:2015-05-05 18:53:03
【问题描述】:

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

【问题讨论】:

  • 看来我认为列应该在 dc.BeginText() 和 dc.EndText() 内,删除这些修复了错误。

标签: c# pdf itextsharp


【解决方案1】:

您正在创建非法的 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,一个隐藏所有低级操作的类:

var ct = new ColumnText(dc);
ct.SetSimpleColumn(notesDisplay, 55f, 0f, 400f, _verticalAlign, 10f, Element.ALIGN_LEFT);
ct.Go();

由于未知的原因,您正在混合使用这两种方法,创建的代码非常难以理解、维护和调试。请删除所有使用dc 变量的行,除了使用dc 作为参数创建ColumnText 对象的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多