Добавление группы аннотаций из одного pdf на все страницы другого pdf и создание нового выходного pdf

Я создал программу чтения для входного файла и одну для файла разметки. Я не уверен, должен ли я перебирать аннотации, а затем добавлять их одну за другой к выходным данным, или есть способ извлечь все аннотации из файла разметки и добавить их во входной файл, сохраняя их координаты x, z.

У меня есть приведенный ниже код, и я не уверен, что делать в разделе комментариев. Метод AddAnnotation принимает только PdfAnnotation в качестве входных данных, но я не уверен, как преобразовать PdfDictionary в PdfAnnotaiton.

class Program
{
    public static string inputFile = @"E:\pdf-sample.pdf";
    public static string markupFile = @"E:\StampPdf.pdf";
    public static string outputFile = @"E:\pdf.pdf";

    public static PdfReader inputReader = new PdfReader(inputFile);
    public static PdfReader markupReader = new PdfReader(markupFile);

    static void Main(string[] args)
    {
        PdfDocument inputDoc = new PdfDocument(inputReader, new PdfWriter(outputFile));

        PdfDocument markupDoc = new PdfDocument(markupReader);

        int n = inputDoc.GetNumberOfPages();
        for (int i = 1; i <= n; i++)
        {
            PdfPage page = inputDoc.GetPage(i);

            PdfDictionary markupPage = markupDoc.GetFirstPage().GetPdfObject();
            PdfArray annots = markupPage.GetAsArray(PdfName.Annots);

            if(annots != null)
            {
                for(int j=0; j < annots.Size(); j++)
                {
                    PdfDictionary annotItem = annots.GetAsDictionary(i);
                    //******
                    //page.AddAnnotation(?);
                    //******
                }
            }
        }
        inputDoc.Close();
    }
}

Я попробовал другой вариант после того, как нашел новый метод GetAnnotations в iText7. Здесь код работает нормально, но я не могу открыть файл O/P и получаю сообщение об ошибке, что файл поврежден. Также, когда я запустил inputDoc.Close() вместо последней строки, приведенной ниже, я получил сообщение об ошибке «Косвенный объект Pdf принадлежит другому PDF-документу. Скопировать объект в текущий PDF-документ».

        PdfReader ireader = new PdfReader(inputFile);
        PdfDocument inputDoc = new PdfDocument(ireader, new PdfWriter(outputFile));
        PdfReader mreader = new PdfReader(markupFile);
        PdfDocument markupDoc = new PdfDocument(mreader);
        var annots = markupDoc.GetFirstPage().GetAnnotations();
        if (annots != null)
        {
            for (int j = 0; j < annots.Count(); j++)
            {
                inputDoc.GetFirstPage().AddAnnotation(annots[j]);
            }
        }
        ireader.Close();
        mreader.Close();
        markupDoc.Close();
        inputDoc.SetCloseWriter(true);

person Ragu So Good    schedule 04.08.2017    source источник
comment
Какую библиотеку вы используете для чтения pdf?   -  person Piotr    schedule 04.08.2017
comment
@Piotr - я использую iText7   -  person Ragu So Good    schedule 04.08.2017


Ответы (1)


Может быть, попробуйте это:

    if (annots != null)
    {
        for (int j = 0; j < annots.Size(); j++)
        {
            PdfDictionary annotItem = annots.GetAsDictionary(i);
            PdfLineAnnotation lineAnnotation = new PdfLineAnnotation(annotItem);
            page.AddAnnotation(lineAnnotation);
        }
    }

Если это не работает, вот документация (к сожалению, на Java)

http://developers.itextpdf.com/examples/actions-and-annotations/clone-creating-and-adding-annotations

Если бы вы могли опубликовать Pdf с аннотациями, которые вы хотите скопировать, возможно, я смогу отладить и попробовать что-то еще.

person Piotr    schedule 04.08.2017
comment
@Piotr-Я добавил изображения моих входных и размеченных pdf-файлов, на которые вы можете сослаться, и, как вы можете видеть, они содержат много строк аннотаций. Можете ли вы помочь мне с некоторыми предложениями. Или вы можете отправить мне свой почтовый идентификатор, так что вы можете отправить вам PDF-файлы. - person Ragu So Good; 04.08.2017
comment
Загрузите его и дайте нам ссылку (например: wetransfer.com) - так не только я, но и все шанс вам в этом помочь) - person Piotr; 04.08.2017
comment
wetransfer.com/downloads/ - person Ragu So Good; 04.08.2017
comment
Я добавил ссылку на входной PDF-файл и PDF-файл, содержащий разметку. - person Ragu So Good; 04.08.2017