C# 如何删除图像属性,例如Adobe Illustrator嵌入到PDF文件中的本地路径?

C# 如何删除图像属性,例如Adobe Illustrator嵌入到PDF文件中的本地路径?,c#,pdf,adobe,itextsharp,C#,Pdf,Adobe,Itextsharp,我试图用iTextSharp(不是java版本)替换PDF文件中的图像。它工作得很好,但唯一的问题是当我用AdobeIllustrator打开PDF时,它总是用旧的硬链接打开。这意味着Abode Illustrator在替换之前始终查看旧图像。这里有点奇怪,它可以用AdobeReader查看(替换后的图像可以查看) 这是我尝试过的snip代码: public static void ReplaceImage(string pdfIn, string imagePath, string pdfOu

我试图用iTextSharp(不是java版本)替换PDF文件中的图像。它工作得很好,但唯一的问题是当我用AdobeIllustrator打开PDF时,它总是用旧的硬链接打开。这意味着Abode Illustrator在替换之前始终查看旧图像。这里有点奇怪,它可以用AdobeReader查看(替换后的图像可以查看)

这是我尝试过的snip代码:

public static void ReplaceImage(string pdfIn, string imagePath, string pdfOut)
        {
            PdfReader reader = new PdfReader(pdfIn);
            PdfStamper stamper = new PdfStamper(reader, new FileStream(pdfOut, FileMode.Create));

            PdfWriter writer = stamper.Writer;
            Image img = Image.GetInstance(SysDrawing.Image.FromFile(imagePath), ImageFormat.Tiff);

            PdfDictionary page = reader.GetPageN(1);
            PdfDictionary resources = page.GetAsDict(PdfName.RESOURCES);

            PdfDictionary xobject = resources.GetAsDict(PdfName.XOBJECT);
            PdfDictionary properties = resources.GetAsDict(PdfName.PROPERTIES);
            PdfDictionary procset = resources.GetAsDict(PdfName.PROCSET);

            if (xobject != null)
            {
                List<PdfName> imgs = new List<PdfName>();
                foreach (var ele in xobject.Keys)
                {
                    PdfIndirectReference iref = xobject.GetAsIndirectObject(ele);

                    imgs.Add(ele);

                    if (iref.IsIndirect())
                    {
                        try
                        {
                            PdfDictionary pg = (PdfDictionary)PdfReader.GetPdfObject(iref);
                            if (pg != null)
                            {
                                PdfReader.KillIndirect(iref);
                                if (PdfName.IMAGE.Equals(SubType))
                                {
                                    if (img.ImageMask != null)
                                        writer.AddDirectImageSimple(img.ImageMask);
                                    writer.AddDirectImageSimple(img, iref);
                                }
                            }
                            else
                            {
                                PdfReader.KillIndirect(iref);
                                writer.AddDirectImageSimple(img, iref);
                            }
                        }
                        catch { 
                            continue; 
                        }

                    }

                }
            }

            //stamper.SetFullCompression();
            stamper.Close();
            stamper.Dispose();

            reader.RemoveUnusedObjects();
            reader.RemoveAnnotations();
            reader.RemoveFields();
            reader.Close();
            reader.Dispose();
        }
publicstaticvoidreplaceimage(stringpdfin、stringimagepath、stringpdfout)
{
PdfReader读取器=新PdfReader(pdfIn);
PdfStamper stamper=newpdfstamper(读取器,newfilestream(pdfOut,FileMode.Create));
PdfWriter writer=母版。writer;
Image img=Image.GetInstance(SysDrawing.Image.FromFile(imagePath),ImageFormat.Tiff);
PdfDictionary page=reader.GetPageN(1);
PdfDictionary resources=page.GetAsDict(PdfName.resources);
PdfDictionary xobject=resources.GetAsDict(PdfName.xobject);
PdfDictionary properties=resources.GetAsDict(PdfName.properties);
PdfDictionary procset=resources.GetAsDict(PdfName.procset);
if(xobject!=null)
{
List imgs=新列表();
foreach(xobject.Keys中的变量ele)
{
PdfIndirectReference iref=xobject.GetAsIndirectObject(ele);
imgs.Add(ele);
if(iref.IsIndirect())
{
尝试
{
PdfDictionary pg=(PdfDictionary)PdfReader.GetPdfObject(iref);
如果(pg!=null)
{
PdfReader.KillIndirect(iref);
if(PdfName.IMAGE.Equals(子类型))
{
如果(img.ImageMask!=null)
writer.AddDirectImageSimple(img.ImageMask);
AddDirectImageSimple(img,iref);
}
}
其他的
{
PdfReader.KillIndirect(iref);
AddDirectImageSimple(img,iref);
}
}
捕获{
继续;
}
}
}
}
//stamper.SetFullCompression();
压模关闭();
母模处理();
reader.RemoveUnusedObjects();
reader.RemoveAnnotations();
reader.RemoveFields();
reader.Close();
reader.Dispose();
}

任何答复都将不胜感激

您的PDF包含两个不同的文档:一个使用PDF语法描述,另一个使用Adobe Illustrator语法描述。这两个不同的文档看起来应该相同,但是当您更改了文档的PDF版本时,它们就不再相同了

您只将文档视为一个文档,因为AI文档存储在PDF文档中。在另一个问题中,mkl解释了机制:

在他的回答中,mkl解释了如何将隐藏数据(在本例中为隐藏摘要,在本例中为IA格式的文档)添加到PDF中

您可以按如下方式删除第二个文档:

PdfDictionary catalog = reader.getCatalog();
catalog.remove(PdfName.PIECEINFO);

当然,这完全抛弃了Adobe Illustrator,因此您将无法再在Adobe Illustrator中编辑PDF。如果您想更改图像的AI语法,您需要一个能够更改AI语法的库(我不知道有任何这样的库)。

您的代码只更改标准PDF条目(即ISO 33000-1中定义的条目)。因此,PDF查看器(如Adobe reader)尊重您的编辑。另一方面,Illustrator也添加了自己的非标准条目,您的代码不会处理这些条目。不幸的是,illustrator相信自己的条目多于标准的PDF条目,因此不尊重您的编辑。我很高兴看到您的评论,但问题仍然存在。什么都没变!我使用了PdfDictionary catalog=reader.catalog;catalog.Remove(PdfName.PIECEINFO);