XML 的 iText 解析器异常 -> PDF 转换

iText parser exception for XML -> PDF conversion

我有一个基本的 .vm 文件,用 XML 填充,然后使用 iText 将其转换为 PDF 文档:

<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE itext SYSTEM "http://itext.sourceforge.net/itext.dtd">-->
<itext creationdate='${System.DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss")}' producer="X">
  <paragraph align="Default" size="18.0" style="bold" indentationleft="0.0">
    Test
  </paragraph>
</itext>

上面的解析绝对没问题。但是稍微复杂一些:

<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE itext SYSTEM "http://itext.sourceforge.net/itext.dtd">-->
<itext creationdate='${System.DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss")}' producer="X">
  <paragraph align="Default" size="18.0" style="bold" indentationleft="0.0">
    Test
  </paragraph>
  <table>
    <row>
      <cell>
        <paragraph>
          Table test
        </paragraph>
      </cell>
    </row>
  </table>
</itext>

异常失败 "Unable to cast object of type 'iTextSharp.text.Paragraph' to type 'iTextSharp.text.Table'."

有什么想法吗?当然我看不出有任何格式问题。

首先,如果您使用 iText DTD XML 将 PDF 转换为 PDF,那么您使用的是 2008/2009 年非常古老且过时的 4.x 系列 iTextSharp。该版本有许多 5.x 系列修复的错误。如果您因为许可而使用该版本,我鼓励您(和您的法定代表)阅读 iText Sales FAQ 页面标题的第四部分 我为什么不使用 iText 2.x(或 iTextSharp 4.x)?.

其次,但与第一个相关的是,有一种现代方法可以将 XML 转换为 PDF。阅读 through this answer,其中有更多细节,并有来自 iText 作者的链接,他自己解释了为什么你不应该再使用 DTD。

最后,如果您仍然要使用 DTD 方法,有人说您可以在结束 </paragraph> 和开始 <table> 标签之间放置一个 <ignore/> 标签,这样iText 的解析器会跳过已知问题的空白。 This post 还谈到了一种使用 XmlTextReader 来解析 XML 的方法。最后,您可以尝试删除 XML 标签之间的所有空格,看看是否能解决问题。