我的问题和标题说的完全一样。
我问这个问题的原因是我需要解决一个错误的设计。简单地说,我的任务是实现回调函数的主体。回调函数接收iTextSharp.text.Document和其他非iTextSharp数据的单个参数。回调函数随后将添加内容(图像、文本等)。给Document。它不接收PdfWriter或PdfContentByte参数。回调函数将无法向其调用方询问任何其他内容。
根据"iText in Action“一书的第1.3.2章,iTextSharp.text.Document对象允许将高级对象添加到PDF中,而如果任何人需要添加低级别内容,则需要PdfWriter或其底层PdfContentByte。
设计错误是,以前的软件设计要求只指定需要添加高级别对象所涵盖的内容。现在需求发生了变化,我还必须添加低级别的内容。然而,回调接口是基于以前的要求,是不可更改的(由于半技术问题)。
特别是,我必须在某些内容上应用setRGBColorFillF。这就是我需要访问低级作家的原因。
因此,我的详细问题是:
PdfWriter或PdfContentByte时,是否可以单独访问iTextSharp.text.Document?PdfWriter或PdfContentByte (在不同的文档或流上),用要添加的内容填充它,然后转换成可以添加回给回调函数的Document实例的表单?从我对其他堆栈溢出问题的解读来看,两者都是不可能的。然而,由于要求更改界面的困难,我认为再次请求是谨慎的。
注1.
(对于那些坚持要知道更改接口的难度的人来说,错误设计的接口已经是不受欢迎的,因此,任何未来的更改都意味着,如果回调实现需要设计正确的接口,那么使用前一个接口的客户端将丢失该功能(回调函数添加的内容)。)
注2.
我知道获得PdfContentByte的正确方法,就像在this answer中一样。我还责怪自己在这个过程中更早地向另一个项目团队建议了错误的界面,而没有充分认识到第1.3章中描述的五个步骤“分五个步骤创建一个PDF文档”中的含义。
发布于 2014-10-28 07:34:18
让我解释一下iText的一些历史。
当我最初编写iText时,我打算创建一个库,它能够创建PDF文档,并且允许开发人员创建PDF,而不必费心使用PDF语法。
为了实现这一点,我介绍了Document类和PdfWriter类之间的区别。Document类不应该知道PDF正在创建,它只用于为内容添加内容,如Paragraph、List和其他高级对象。PdfWriter负责将所有这些内容转换成PDF格式。
然而: PDF不是一种琐碎的文档格式,我面临着一个恼人的问题:如果在创建PDF文档的过程中出了问题,我最终得到的是一个不完整的PDF文件,并且很难调试这样的文件,因为如果您只有一个PDF文件的一半,您通常不知道是什么原因造成了这个问题。
因此,我还介绍了一个HtmlWriter (稍后,其他人也创建了一个RtfWriter)。概念很简单:您将创建一个Document实例,并将一个或多个侦听器附加到此Document。您可以添加一个或多个PdfWriter实例、一个或多个HtmlWriter实例等。
在最近版本的iText中,HtmlWriter和RtfWriter已经从库中删除,但概念仍然存在:作者监听文档,文档不可能知道有多少(如果有的话)作者正在监听。
这是我对你问题的长篇回答。
简短的版本是“否”,当您只有一个PdfWriter实例时,不可能访问Document实例。
https://stackoverflow.com/questions/26599335
复制相似问题