如何删除图像属性,如Adobe Illustrator已嵌入PDF文件的本地路径

本文关键字:PDF 文件 路径 Adobe 何删除 删除 属性 图像 Illustrator | 更新日期: 2023-09-27 18:21:31

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

这是我尝试过的狙击代码:

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();
        }

任何答案都将不胜感激!

如何删除图像属性,如Adobe Illustrator已嵌入PDF文件的本地路径

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

您认为文档只是一个文档,因为AI文档存储在PDF文档中。在关于SO的另一个问题中,mkl解释了其机制:使用iText库在pdf中插入隐藏摘要

在他的回答中,mkl解释了如何将隐藏数据(在这种情况下是隐藏摘要,在您的情况下是IA格式的文档)添加到PDF中。

你可以这样删除第二个文档:

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

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