2014-09-11 17 views
0

我試圖用iTextSharp(不是Java版本)替換PDF文件中的圖像。它工作正常,但只有問題是,當我用Adobe Illustrator打開PDF時,它總是用舊的硬鏈接打開。這意味着Abode Illustrator在更換之前總是查看舊圖像。這裏有點奇怪,用Adobe Reader可以看到很好的效果(可以看到替換的圖片)。如何刪除圖像屬性,例如Adobe Illustrator已嵌入PDF文件的本地路徑?

這是在剪斷的代碼,我已經試過:

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

任何答覆,將不勝感激!

+1

您的代碼僅更改標準PDF條目(即,在ISO 33000-1中定義的條目)。因此,PDF閱讀器(如Adobe閱讀器)尊重您的編輯。另一方面,Illustrator也會添加自己的非標準條目,而您的代碼無法處理這些條目。不幸的是,插畫師認爲自己的作品比標準的PDF作品更多,因此不尊重你的編輯。 – mkl 2014-09-11 04:44:59

回答

1

您的PDF包含兩個不同的文檔:一個使用PDF語法描述,一個使用Adobe Illustrator語法描述。這兩個不同的文檔應該看起來完全相同,但是由於您已經更改了文檔的PDF版本,他們不再這樣做。

由於AI文檔存儲在PDF文檔中,因此您將該文檔視爲只有一個文檔。在對SO另一個問題,MKL解釋機制:Insert hidden digest in pdf using iText library

在他的回答,MKL介紹如何添加隱藏的數據(在這種情況下,一個隱藏的摘要,你的情況在IA格式文檔)轉換爲PDF。

您可以刪除該第二個文檔是這樣的:

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

當然,這完全扔掉了Adobe Illustrator的,所以你將無法再編輯在Adobe Illustrator的PDF。如果您希望圖像在AI語法中更改,您需要一個能夠更改AI語法的庫(並且我不知道任何此類庫)。

+0

我很高興看到您的評論,但問題仍然存在。沒有改變!我用PdfDictionary catalog = reader.Catalog; catalog.Remove(PdfName.PIECEINFO); – HICURIN 2014-09-11 09:41:21

相關問題