簡體   English   中英

如何刪除圖像屬性,例如Adobe Illustrator已嵌入到PDF文件的本地路徑?

[英]How can I remove image properties such as local path that Adobe Illustrator has been embedded to PDF file?

我正在嘗試使用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();
        }

任何答案將不勝感激!

您的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語法的庫(我不知道任何此類庫)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM