使用iTextSharp.text.pdf.PdfStamper添加附件

时间:2015-12-27 10:37:57

标签: pdf itextsharp

我从接收PdfStamper.AddFileAttachment接收四个参数的PdfStamper.AddFileAttachment变得有点麻烦,它接收PdfFileSpecification对象作为参数。问题是我想将文件作为嵌入文件添加到我的pdf文档中, 有人可以告诉我,我是否正确地做到了这一点?!

我已取代:iText_Stamper.AddFileAttachment(desc, b, s, s);

with:

PdfFileSpecification pfs = PdfFileSpecification.FileEmbedded(iText_Stamper.Writer,
                            f.sDataFileName, s, b);
                        pfs.AddDescription(desc, true);
                        iText_Stamper.AddFileAttachment(desc, pfs);

                        PdfTargetDictionary target = new PdfTargetDictionary(true);
                        target.EmbeddedFileName = s;
                        PdfDestination dest = new PdfDestination(PdfDestination.FIT);
                        dest.AddFirst(new PdfString(desc));
                        iTextSharp.text.pdf.PdfAction action = iTextSharp.text.pdf.PdfAction.GotoEmbedded(null, target,
                            dest, true);
                        Chunk chunk = new Chunk(desc);
                        chunk.SetAction(action);
                        iText_Stamper.Writer.Add(chunk);

这足够吗?我做得对吗? 我会很高兴得到一些帮助。

1 个答案:

答案 0 :(得分:0)

您的代码中的主要问题是您认为PdfWriter后代iText_Stamper.Writer可以像Document一样使用,您可以使用Add添加文本块方法,并期望iTextSharp自动布局这样的材料。

不幸的是,类层次结构表明,PdfWriterDocument都实现了提供方法IElementListener的接口bool Add(IElement element)

尽管如此,这个假设是错误的,为了内部代码重用原因,类层次结构重叠,而不是建议类似的用法; Add后代PdfWriter的{​​{1}}实现仅返回iText_Stamper.Writer,甚至不会尝试将给定元素添加到文档中。

特别是在页面的情况下,从底层的false中检索到的压模(并没有添加到它们),这确实有意义:如果内容以某种方式散布在页面上,那么压模应该添加到哪里新内容?它应该考虑现有的内容背景材料并从顶部开始吗?或者它应该以某种方式找到一个很大的未使用的页面区域并在那里绘制元素? (但是,如果新添加的页面,压模确实可以编程为像常规PdfReader一样,并允许与PdfWriter链接以自动布局内容......)

因此,为了允许自动布局新内容,您必须告诉iTextSharp将内容放在何处。您可以通过Document这样的实例执行此操作:

ColumnText

(我使用了比你的using (PdfReader reader = new PdfReader(source)) using (PdfStamper stamper = new PdfStamper(reader, new FileStream(result, FileMode.Create, FileAccess.Write))) { PdfFileSpecification pfs = PdfFileSpecification.FileEmbedded(stamper.Writer, pdfPath, pdfName, pdfBytes); pfs.AddDescription(pdfDesc, true); stamper.AddFileAttachment(pdfDesc, pfs); PdfContentByte cb = stamper.GetOverContent(1); ColumnText ct = new ColumnText(cb); ct.SetSimpleColumn(30, 30, reader.GetPageSize(1).GetRight(30), 60); PdfTargetDictionary target = new PdfTargetDictionary(true); target.EmbeddedFileName = pdfDesc; PdfDestination dest = new PdfDestination(PdfDestination.FIT); dest.AddFirst(new PdfNumber(1)); PdfAction action = PdfAction.GotoEmbedded(null, target, dest, true); Chunk chunk = new Chunk(pdfDesc); chunk.SetAction(action); ct.AddElement(chunk); ct.Go(); } 更具描述性的名字)

在布局你的块的过程中,f.sDataFileName, s, b还建立了所需的转到的链接。

顺便说一句,从您编写嵌入文件并使用ColumnText我假设您附加了另一个PDF。如果该假设恰好是错误的,您可能希望使用PdfAction.GotoEmbedded代替