单独给出iTextSharp.text.Document时,是否可以访问PdfWriter或PdfContentByte?

时间:2014-10-28 01:06:22

标签: itextsharp pdf-writer

我的问题正如标题所说的那样。

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

根据本书第34.2章&#34; iText in Action&#34;,iTextSharp.text.Document对象允许添加 高级对象 < / strong>到PDF,如果有人需要添加 低级内容 ,则需要PdfWriter或其基础PdfContentByte

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

特别是,我必须对某些内容应用setRGBColorFillF。这就是我需要访问低级编写者的原因。

我的详细问题是:

  • 单独PdfWriter时,是否可以访问PdfContentByteiTextSharp.text.Document
  • 如果不是,是否可以单独构建PdfWriterPdfContentByte(在不同的文档或流上),用要添加的内容填充它,然后转换为可以的形式被添加回给予回调函数的Document实例?

从我对其他Stackoverflow问题的阅读中,两者都不可能。但是,由于要求更改界面的难度,我认为再次提问是明智的。


备注1。

(对于那些坚持知道更改界面的难度的人来说,错误设计的界面已经在野外,因此任何未来的变化都意味着使用之前界面的客户端将缺少该功能(内容)如果回调实现需要正确设计的接口,则由回调函数添加。)


备注2.

我知道获取PdfContentByte的正确方法,如this answer中所述。我还责怪自己在过程中更早地向另一个项目团队提出了错误的界面,而没有完全意识到第1.3章和第34章中描述的五个步骤中的含义是什么意思?在五个步骤中创建PDF文档&#34;。

1 个答案:

答案 0 :(得分:2)

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

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

为实现这一目标,我介绍了Document类和PdfWriter类之间的区别。 Document类不应该知道正在创建PDF,它只用于添加Paragraph s,List和其他高级别的内容。内容的对象。 PdfWriter负责将所有这些内容翻译成PDF格式。

然而:PDF不是一个简单的文档格式,我遇到了一个令人烦恼的问题:如果在创建PDF文档时出现问题,我最终得到的PDF文件不完整,调试非常困难这样的文件,因为如果你只有一半的PDF文件,你常常不知道导致问题的原因。

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

在iText的最新版本中,HtmlWriterRtfWriter已从库中删除,但概念仍然存在: writer 侦听文档,并且文档无法知道有多少(如果有的话)作者在听。

这是我对你的问题的答案的长版本。

简短版本为否,当您只有PdfWriter个实例时,无法访问Document个实例。