使用最新版本的 iText XML 到 PDF

Posted

技术标签:

【中文标题】使用最新版本的 iText XML 到 PDF【英文标题】:iText XML to PDF using latest version 【发布时间】:2014-01-07 08:50:21 【问题描述】:

我找到了一些示例,展示了如何使用 iText XML 文档将 XML 转换为 PDF。但它们都适用于旧版本 4.x。是否有任何示例或有人可以发布所需/更新代码的示例以在版本 5.x 中执行相同操作?

所有示例都引用了这样的代码,但我找不到在新版本中用什么来替换 ITextHandler 类。http://www.ridgway.co.za/archive/2005/07/31/itextsharpxmltopdfexample.aspx

Document document = new Document();
PdfWriter.GetInstance(document, new FileStream("ExampleDoc.pdf", FileMode.Create));
ITextHandler xmlHandler = new ITextHandler(document);
xmlHandler.Parse("ExampleDoc.xml");

另外,我不想从 html 转到 PDF。 CSS 样式永远不会按预期出现。

编辑来提高它,这里真的需要一些帮助。有人吗?

【问题讨论】:

您要处理的这个 xml 有多复杂? 在这一点上,我愿意按照它需要的方式构建它。目前还没有 XML,因为我无法让示例工作。我要做的就是构建一个简单的发票模板。 为什么不把它转换成 HTML?如果你真的不想把它转换成 HTML,你总是可以扩展 XMLWorker 并编写你自己的解析器。 为什么投反对票?? 【参考方案1】:

iText 使用专有语法对 XML 文件的处理在很久以前就被删除了。请参阅this 和this 以获得作者的直接回答。相反,我们鼓励您使用全球公认的 XML 标准,该标准 XHTML。

我知道您说过您不想使用 HTML,因为它永远不会正确显示,但也许您可以发布一些您正在尝试的示例,我们可以提供帮助。另外,请确保您使用的是 XMLWorker 而不是 HTMLWorker。使用时请参阅这些链接以获取更多帮助/信息。

List of supported CSS properties Controlling fonts in HTML processing Adding base64 encoded images Changing the default image root path for relative images

编辑

此编辑是对@JohnC 评论的回应

我不能代表 iText 团队及其原因,但我可以猜测。 PDF 没有“段落”、“单词”、“表格”等。相反,PDF 有文本、绘图(线条、图案)和图像。如果您想手动执行这些操作,您可以使用原始的 PdfContentByte 对象。但是,我们鼓励您使用 iText 的抽象,例如 ParagraphPdfPTable,它们代表您使用 PdfContentByte

要让 iText 支持 XML 格式,它首先需要创建自己的专有 DTD 和/或 XML Schema。如果添加了任何功能,则需要正确地对架构进行版本控制,这可能会给消费者带来问题和困惑。然后它需要构建/维护一个解析器,将 XML 抽象转换为 iText 抽象或原始 PDF 命令。对于前者,你有一个抽象与一个正在乞求打破的抽象对话。对于后者,您现在有两个抽象实现,最终会遇到功能奇偶校验问题。

此外,XML 代表什么?段落、文本块、图像和表格?听起来已经像 HTML,所以没有必要重复这种模式。还是“使用字体ABC将内容Z放在坐标X,Y”?这就是PdfContentByte 的用武之地。的确,可能有一个本地解析器,但我猜只是没有太多人要求一个。或者 XML 是您自己的格式,基于您自己的数据,例如 <book><inventory>?如果是这种情况,那么 iText 也真的不知道如何设置样式。但是,您可以利用 .Net/Java 和 XSLT 将您的 XML 转换为它知道的 XHTML 命令。

【讨论】:

第一个链接只是说他删除了对 DTD 的支持,不清楚是否是对整个 XML 到 PDF 功能的注释。构建一个具有准确方向的 iText XML 模板似乎更容易告诉 PDF 事情的发展方向,而不是 XHTML 和反复试验它对有限 CSS 的理解。 @JohnC,我在上面回复了。我不代表 iText 团队发言,所以这只是我个人的看法。我并不是说 XML 表示会不好,事实上我自己已经完成了。但是,iText 团队必须对要处理的内容进行分类,我认为没有多少人要求这样做。如果您可以向他们展示特定的用例,他们可能会给出建议,或者可能会将其作为功能添加到未来版本中。 好吧,从我看到的 iText XML 在旧版本中,就是这样,将内容 Z 与 Font ABC 放在坐标 X,Y 上。我对 xhtml 的问题不是 xhtml 部分,如果它按预期工作,那就太好了。它的CSS翻译器没有按预期翻译的问题。是否有任何使用 PdfContentByte 或 iText 的抽象(如 Paragraph 和 PdfPTable)的代码构建 PDF 的“好”示例? 你试过 XMLWorker 吗?它确实做得很好,尤其是当您使用更简单的 CSS 属性(如字体和颜色)时。上面的控制字体链接展示了一个非常基本的加载 CSS 文件和注册字体的示例。您不能做的一件事是绝对定位事物,因为 HTML 和 PDF 的坐标使用不同的原点。否则,几乎每个示例都使用像 Paragraph 这样的抽象。 如果你想使用PdfContentByte 有一个隐含的规则,你已经阅读了 PDF 规范,至少部分阅读。实际的 PDF 规范不支持换行、文本加粗、表格等,您需要手动执行这些操作。如果你愿意,你可以给我发电子邮件(见个人资料),我们可以谈谈你的具体需求。

以上是关于使用最新版本的 iText XML 到 PDF的主要内容,如果未能解决你的问题,请参考以下文章

使用 iText 将字体嵌入 PDF 文件

Java操作PDF之iText超入门

转 Java操作PDF之iText详细入门

Java操作PDF之itext入门

Java操作PDF之iText详细入门

PDFJava操作PDF之iText超入门