为什么我从带有 IText7 的 pdf 中得到相同的附件两次
Why did I get the same attachment twice from a pdf with IText7
我尝试使用
向 PDF 文件添加 XML 附件
String xmlFileDisplayName;
string path = @"E:\test\a4_blank.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfReader(path), new PdfWriter(@"e:\test\out\embedxml.pdf"));
string xmlpath = @"C:\Users\yalin\Desktop.xml";
var bytes = File.ReadAllBytes(xmlpath);
xmlFileDisplayName = "1.xml";
PdfFileSpec fs = PdfFileSpec.CreateEmbeddedFileSpec(pdfDoc, bytes, "xml data file attachment", xmlFileDisplayName, PdfName.ApplicationXml, null, new PdfName("Data"));
pdfDoc.AddFileAttachment(xmlFileDisplayName, fs);
pdfDoc.Close();
当我将此 XML 附件与
一起使用时
string path = @"e:\test\out\embedxml.pdf";
string outPath = @"e:\test\out";
PdfReader reader = new PdfReader(path);
PdfDocument pdfDoc = new PdfDocument(new PdfReader(path));
PdfDictionary root = pdfDoc.GetCatalog().GetPdfObject();
PdfDictionary documentNames = root.GetAsDictionary(PdfName.Names);
if (documentNames != null)
{
PdfDictionary embeddedFiles = documentNames.GetAsDictionary(PdfName.EmbeddedFiles);
if (embeddedFiles != null)
{
PdfArray filespecs = embeddedFiles.GetAsArray(PdfName.Names);
for (int i = 0; i < filespecs.Size(); i++)
{
i++;
PdfDictionary filespec = filespecs.GetAsDictionary(i);
PdfDictionary file = filespec.GetAsDictionary(PdfName.EF);
foreach (PdfName key in file.KeySet())
{
var fos = File.Create(Path.Combine(outPath, filespec.GetAsString(key).ToString()));
var stream = file.GetAsStream(key);
fos.Write(stream.GetBytes());
fos.Flush();
fos.Close();
}
}
}
}
我得到了两次。
添加附件或获取附件是否有任何问题。
谢谢
您遍历每个文件规范字典中 EF(嵌入文件)字典的所有条目:
PdfDictionary file = filespec.GetAsDictionary(PdfName.EF);
foreach (PdfName key in file.KeySet())
{
var fos = File.Create(Path.Combine(outPath, filespec.GetAsString(key).ToString()));
var stream = file.GetAsStream(key);
fos.Write(stream.GetBytes());
fos.Flush();
fos.Close();
}
但是 EF 中可能有多个条目都指向同一个嵌入文件或它的不同变体。
对于您的文档,EF 字典包含两个条目(对于 F 和 UF 键)都指向与嵌入的相同流 xml.
Is there any problem with adding attachments, or get them.
根据规范,这个结构是正确的(实际上甚至是推荐的)。因此,您添加附件没有问题。
因此,您必须更加谨慎地解释 EF 词典的内容,并准备好在此处找到具有相同或 non-identical 内容的多个条目。
我尝试使用
向 PDF 文件添加 XML 附件String xmlFileDisplayName;
string path = @"E:\test\a4_blank.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfReader(path), new PdfWriter(@"e:\test\out\embedxml.pdf"));
string xmlpath = @"C:\Users\yalin\Desktop.xml";
var bytes = File.ReadAllBytes(xmlpath);
xmlFileDisplayName = "1.xml";
PdfFileSpec fs = PdfFileSpec.CreateEmbeddedFileSpec(pdfDoc, bytes, "xml data file attachment", xmlFileDisplayName, PdfName.ApplicationXml, null, new PdfName("Data"));
pdfDoc.AddFileAttachment(xmlFileDisplayName, fs);
pdfDoc.Close();
当我将此 XML 附件与
一起使用时string path = @"e:\test\out\embedxml.pdf";
string outPath = @"e:\test\out";
PdfReader reader = new PdfReader(path);
PdfDocument pdfDoc = new PdfDocument(new PdfReader(path));
PdfDictionary root = pdfDoc.GetCatalog().GetPdfObject();
PdfDictionary documentNames = root.GetAsDictionary(PdfName.Names);
if (documentNames != null)
{
PdfDictionary embeddedFiles = documentNames.GetAsDictionary(PdfName.EmbeddedFiles);
if (embeddedFiles != null)
{
PdfArray filespecs = embeddedFiles.GetAsArray(PdfName.Names);
for (int i = 0; i < filespecs.Size(); i++)
{
i++;
PdfDictionary filespec = filespecs.GetAsDictionary(i);
PdfDictionary file = filespec.GetAsDictionary(PdfName.EF);
foreach (PdfName key in file.KeySet())
{
var fos = File.Create(Path.Combine(outPath, filespec.GetAsString(key).ToString()));
var stream = file.GetAsStream(key);
fos.Write(stream.GetBytes());
fos.Flush();
fos.Close();
}
}
}
}
我得到了两次。 添加附件或获取附件是否有任何问题。 谢谢
您遍历每个文件规范字典中 EF(嵌入文件)字典的所有条目:
PdfDictionary file = filespec.GetAsDictionary(PdfName.EF);
foreach (PdfName key in file.KeySet())
{
var fos = File.Create(Path.Combine(outPath, filespec.GetAsString(key).ToString()));
var stream = file.GetAsStream(key);
fos.Write(stream.GetBytes());
fos.Flush();
fos.Close();
}
但是 EF 中可能有多个条目都指向同一个嵌入文件或它的不同变体。
对于您的文档,EF 字典包含两个条目(对于 F 和 UF 键)都指向与嵌入的相同流 xml.
Is there any problem with adding attachments, or get them.
根据规范,这个结构是正确的(实际上甚至是推荐的)。因此,您添加附件没有问题。
因此,您必须更加谨慎地解释 EF 词典的内容,并准备好在此处找到具有相同或 non-identical 内容的多个条目。