2011-09-03 25 views
4

我最近搬到幾乎完全電子書籍。我更喜歡在閱讀時用突出顯示或註釋標記文檔。如何將註釋/突出顯示從一個PDF複製到該PDF的更新版本?

但是,當我獲得PDF的更新版本時 - 例如,O'Reilly將允許訪問您已購買的書籍的更正版本 - 然後我會將其標記爲舊版本和較新的副本,沒有我的筆記。

我的首選語言是C#我意識到iTextSharp可能是我需要使用的,如果我想以編程方式執行此操作(請參閱Copy pdf annotations via C#),但有沒有更簡單的方法來處理此問題?

我不敢相信我是唯一一個有這個問題的人,那麼是否有可能已經有解決方案來處理這個問題了?

+0

我也需要這個解決方案! – teenup

回答

0

你可以用這個例子iTextSharp的接近你的問題:

var output = new MemoryStream(); 

using (var document = new Document(PageSize.A4, 70f, 70f, 20f, 20f)) 
{ 
    var readers = new List<PdfReader>(); 
    var writer = PdfWriter.GetInstance(document, output); 

    writer.CloseStream = false; 

    document.Open(); 

    const Int32 requiredWidth = 500; 
    const Int32 zeroBottom = 647; 
    const Int32 left = 50; 

    Action<String, Action> inlcudePdfInDocument = (filename, e) => 
    { 
     var reader = new PdfReader(filename); 
     readers.Add(reader); 

     var pageCount = reader.NumberOfPages; 
     for (var i = 0; i < pageCount; i++) 
     { 
      e?.Invoke(); 
      var imp = writer.GetImportedPage(reader, (i + 1)); 

      var scale = requiredWidth/imp.Width; 
      var height = imp.Height * scale; 

      writer.DirectContent.AddTemplate(imp, scale, 0, 0, scale, left, zeroBottom - height); 

      var annots = reader.GetPageN(i + 1).GetAsArray(PdfName.ANNOTS); 
      if (annots != null && annots.Size != 0) 
      { 
       foreach (var a in annots) 
       { 
        var newannot = new PdfAnnotation(writer, new Rectangle(0, 0)); 
        var annotObj = (PdfDictionary) PdfReader.GetPdfObject(a); 
        newannot.PutAll(annotObj); 
        var rect = newannot.GetAsArray(PdfName.RECT); 
        rect[0] = new PdfNumber(((PdfNumber)rect[0]).DoubleValue * scale + left); // Left 
        rect[1] = new PdfNumber(((PdfNumber)rect[1]).DoubleValue * scale); // top 
        rect[2] = new PdfNumber(((PdfNumber)rect[2]).DoubleValue * scale + left); // right 
        rect[3] = new PdfNumber(((PdfNumber)rect[3]).DoubleValue * scale); // bottom 
        writer.AddAnnotation(newannot); 
       } 
      } 

      document.NewPage(); 
     } 

    } 

    foreach (var apprPdf in pdfs) 
    { 
     document.NewPage(); 

     inlcudePdfInDocument(apprPdf.Pdf, null); 
    } 

    document.Close(); 
    readers.ForEach(x => x.Close()); 
} 

output.Position = 0; 
return output; 

這個例子拷貝帶註釋的PDF文件列表到一個新的PDF文件。

同時從兩個PdfReader獲取數據 - 一個用於複製新的pdf,另一個用於複製舊的pdf註釋。

+0

這似乎只適用於不引用其他間接對象的簡單註釋。 – mkl

相關問題