1

我的问题正如标题所说。

我问这个问题的原因是我需要解决错误的设计。简单来说,我的任务是实现一个回调函数的主体。回调函数接收单个参数iTextSharp.text.Document和其他非 iTextSharp 数据。回调函数随后会将内容(图像、文本等)添加到Document. 它不接收PdfWriterorPdfContentByte参数。回调函数将无法向其调用者询问其他任何内容。

根据“iText in Action”一书的第1.3.2章,该iTextSharp.text.Document对象允许人们向PDF添加高级对象,而如果有人需要添加低级内容PdfWriter,则需要它的底层。PdfContentByte

设计错误在于,以前的软件设计要求只指定需要添加高级对象所涵盖的内容。现在需求变了;我还必须添加低级内容。但是,回调接口是基于之前的要求,不能更改(由于半技术问题)。

特别是我要申请setRGBColorFillF一些内容。这就是我需要访问低级作家的原因。

因此,我的详细问题是:

  • 是否可以访问PdfWriter或单独PdfContentByte提供?iTextSharp.text.Document
  • 如果不是,是否可以单独构造PdfWriterPdfContentByte单独构造(在不同的文档或流上),用要添加的内容填充它,然后转换为可以添加回Document给回调的实例的形式功能?

从我对其他 Stackoverflow 问题的阅读来看,两者都不可能。不过因为要求换界面比较难,我觉得还是再问一次比较稳妥。


备注 1。

(对于那些坚持知道改变界面的难度的人来说,错误设计的界面已经很流行了,因此任何未来的改变都意味着使用以前界面的客户端将丢失该功能(添加的内容通过回调函数)如果回调实现需要正确设计的接口。)


备注 2。

我知道获取 PdfContentByte 的正确方法,如本答案所示。我还责备自己在流程的早期向另一个项目团队建议了错误的界面,而没有完全理解第 1.3 章“通过五个步骤创建 PDF 文档”中描述的五个步骤的含义。

4

1 回答 1

2

让我解释一下 iText 的一些历史。

当我最初编写 iText 时,我打算创建一个能够创建 PDF 文档并允许开发人员创建 PDF 而无需担心 PDF 语法的库。

Document为了实现这一点,我介绍了类和类之间的区别PdfWriter。该类Document不应该知道正在创建 PDF,它仅用于添加内容,例如Paragraphs、Lists 和其他内容的高级对象。PdfWriter负责将所有这些内容翻译成 PDF 。

然而:PDF 不是一种微不足道的文档格式,我遇到了一个烦人的问题:如果在创建 PDF 文档的过程中出现问题,我最终会得到一个不完整的 PDF 文件,并且很难调试这样的文件,因为如果您只有一半的 PDF 文件,您通常不知道导致问题的原因。

所以我也介绍了一个HtmlWriter(后来其他人也创建了一个RtfWriter)。这个概念很简单:您将创建一个Document实例并将一个或多个侦听器附加到 this Document。您可以添加一个或多个PdfWriter实例、一个或多个HtmlWriter实例等。

在 iText 的最新版本中,HtmlWriterRtfWriter已从库中删除,但概念仍然存在:编写者收听文档,文档无法知道有多少(如果有)编写者正在收听。

这是我对您问题的回答的长版本。

简短的版本是不,只有一个实例时无法访问实例。PdfWriterDocument

于 2014-10-28T07:34:18.950 回答