我从接收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);
这足够吗?我做得对吗? 我会很高兴得到一些帮助。
答案 0 :(得分:0)
您的代码中的主要问题是您认为PdfWriter
后代iText_Stamper.Writer
可以像Document
一样使用,您可以使用Add
添加文本块方法,并期望iTextSharp自动布局这样的材料。
不幸的是,类层次结构表明,PdfWriter
和Document
都实现了提供方法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
代替