为什么我从带有 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 字典包含两个条目(对于 FUF 键)都指向与嵌入的相同流 xml.

Is there any problem with adding attachments, or get them.

根据规范,这个结构是正确的(实际上甚至是推荐的)。因此,您添加附件没有问题。

因此,您必须更加谨慎地解释 EF 词典的内容,并准备好在此处找到具有相同或 non-identical 内容的多个条目。