我試圖用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();
}
任何答覆,將不勝感激!
您的代碼僅更改標準PDF條目(即,在ISO 33000-1中定義的條目)。因此,PDF閱讀器(如Adobe閱讀器)尊重您的編輯。另一方面,Illustrator也會添加自己的非標準條目,而您的代碼無法處理這些條目。不幸的是,插畫師認爲自己的作品比標準的PDF作品更多,因此不尊重你的編輯。 – mkl 2014-09-11 04:44:59