如何将注释/突出显示从一个PDF复制到该PDF的更新版本?

如何将注释/突出显示从一个PDF复制到该PDF的更新版本?,pdf,Pdf,我最近几乎完全转向了电子书。我更喜欢在阅读文档时用突出显示或注释来标记文档 然而,当我得到一份PDF的更新版本时——例如,O'Reilly将允许访问您购买的书籍的更正版本——我就会被一份标记的旧版本和一份新版本卡住,没有我的笔记 我的首选语言是C#我意识到,如果我想通过编程实现这一点,我可能需要使用C#语言(参见示例),但有更简单的方法来处理吗 我不敢相信我是唯一一个有这个问题的人,那么可能已经有一个解决方案可以帮我解决这个问题了吗?您可以用这个例子来解决您的问题: var output = n

我最近几乎完全转向了电子书。我更喜欢在阅读文档时用突出显示或注释来标记文档

然而,当我得到一份PDF的更新版本时——例如,O'Reilly将允许访问您购买的书籍的更正版本——我就会被一份标记的旧版本和一份新版本卡住,没有我的笔记

我的首选语言是C#我意识到,如果我想通过编程实现这一点,我可能需要使用C#语言(参见示例),但有更简单的方法来处理吗


我不敢相信我是唯一一个有这个问题的人,那么可能已经有一个解决方案可以帮我解决这个问题了吗?

您可以用这个例子来解决您的问题:

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;
var输出=新内存流();
使用(var文档=新文档(PageSize.A4、70f、70f、20f、20f))
{
var readers=新列表();
var writer=PdfWriter.GetInstance(文档,输出);
writer.CloseStream=false;
document.Open();
常数Int32所需宽度=500;
常数Int32 zeroBottom=647;
常数Int32左=50;
操作inlcudepdFindDocument=(文件名,e)=>
{
var reader=新的PdfReader(文件名);
readers.Add(reader);
var pageCount=reader.NumberOfPages;
对于(变量i=0;ix.Close());
}
输出位置=0;
返回输出;
此示例将带有注释的pdf文件列表复制到新的pdf文件中


同时从两个pdf阅读器获取数据-一个用于复制新pdf,另一个用于复制旧pdf的批注

我也需要这个解决方案!!!这似乎只适用于不引用其他间接对象的简单注释。