2014-09-11 19 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

相关问题