Как пометить/снять отметку, записать как принятую/отклоненную/отмененную текстовую аннотацию с помощью iTextSharp C#

Я работаю с iTextSharp в Visual Studio. Я создал Pdfannotation следующим образом:

PdfAnnotation annotation = PdfAnnotation.CreateText(stamper.Writer, rect, "Author", "I write my text", true, "New Paragraph");
stamper.AddAnnotation(annotation, 1);

Итак, моя аннотация содержит текст «Я пишу свой текст». Когда я захожу в Adobe Acrobat Reader, чтобы открыть свой PDF-файл, и когда я нажимаю кнопку «Комментарий», чтобы увидеть все комментарии, которые я написал в своем PDF-файле, я вижу свой комментарий и рядом с моим комментарием «Я пишу свой текст», я см. маленький квадрат, который я могу поставить или снять. Это небольшой флажок, который был автоматически создан, когда я создавал аннотацию в формате Pdf. Я не создал его сам.

Я хотел бы установить или снять этот маленький флажок с помощью iTextSharp.

Я думал об этом, но это не работает:

  RadioCheckField checkbox = new RadioCheckField(stamper.Writer, rect, "bonjour", "on");
        checkbox.CheckType = RadioCheckField.TYPE_CHECK;
        checkbox.Checked = true;
        PdfFormField field = checkbox.CheckField;

        annotation.Put(PdfName.A, field);

Кто нибудь знает как это сделать ?

Спасибо большое!

Хорошего дня! :)


person Caryluna    schedule 06.06.2016    source источник
comment
Вы создаете текстовую аннотацию. Вы не можете отметить или снять отметку с текстовой аннотации. Пожалуйста, покажите нам, как вы создаете флажок.   -  person Bruno Lowagie    schedule 06.06.2016
comment
Если вы посмотрите на Adobe Acrobat Reader, вы увидите, что после добавления вашей аннотации вы можете выбрать, отметить ее или отключить. Я не могу добавить картинку, сайт не позволяет (потому что я новичок в этом деле).   -  person Caryluna    schedule 06.06.2016
comment
Ваш вопрос неточен. Вы создаете текстовую аннотацию (она же заметка). Вы можете изменить представление на галочку, как показано здесь, но это не то, что вам нужно. спрашивать. Вы просите установить/снять флажок. Флажок — это поле формы, представленное аннотацией виджета, не текстовой аннотацией. Будьте точнее!   -  person Bruno Lowagie    schedule 06.06.2016
comment
На картинке, которую вы мне показываете, в столбце «Списки комментариев» я вижу ваше имя Бруно, а справа от него я вижу маленький квадрат, это флажок, о котором я говорю, и который я хотел бы проверить с помощью itextSharp.   -  person Caryluna    schedule 06.06.2016
comment
Вы знаете значение этого флажка? Пожалуйста, объясни!   -  person Bruno Lowagie    schedule 06.06.2016
comment
В моем офисе они используют его, поскольку эта аннотация утверждена, поэтому я хотел бы знать, как установить или снять этот флажок с помощью iTextSharp. Вы знаете, как это сделать?   -  person Caryluna    schedule 06.06.2016
comment
Установите флажок с помощью Acrobat. Сравните PDF-файл с непроверенной аннотацией с PDF-файлом с проверенной аннотацией с помощью RUPS. Обновите аннотацию соответствующим образом.   -  person Bruno Lowagie    schedule 06.06.2016


Ответы (1)


Вопрос вызвал некоторую путаницу из-за терминологии «отметить/снять отметку» в контексте текстовой (или заметки) аннотации. Правильная терминология была бы следующей: Как пометить/снять пометку с текстовой аннотации?

Установка/снятие флажка сразу же заставляет задуматься о флажках, но следующий снимок экрана показывает, что имеется в виду, когда мы говорим о пометке текстовой аннотации:

введите здесь описание изображения

Пометка текстовой аннотации — это не вопрос установки флажка. Пометка текстовой аннотации выполняется путем добавления скрытой аннотации «В ответе на» (IRT). См. Как добавить аннотацию "В ответ на"? на официальный сайт для получения дополнительной информации об аннотациях «В ответ на».

Я адаптировал AddInReplyTo пример с AddMarked как результат:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfDictionary page = reader.getPageN(1);
    PdfArray annots = page.getAsArray(PdfName.ANNOTS);
    PdfDictionary sticky = annots.getAsDict(0);
    PdfArray stickyRect = sticky.getAsArray(PdfName.RECT);
    PdfDictionary popup = annots.getAsDict(1);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    PdfWriter writer = stamper.getWriter();
    Rectangle stickyRectangle = new Rectangle(
        stickyRect.getAsNumber(0).floatValue(), stickyRect.getAsNumber(1).floatValue(),
        stickyRect.getAsNumber(2).floatValue(), stickyRect.getAsNumber(3).floatValue()
    );
    PdfAnnotation replySticky = PdfAnnotation.createText(
            writer, stickyRectangle, "Bruno", "Marked set by Bruno", false, "Comment");
    replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0));
    replySticky.put(PdfName.STATE, new PdfString("Marked"));
    PdfNumber n = sticky.getAsNumber(PdfName.F);
    replySticky.put(PdfName.F, new PdfNumber(n.intValue() | PdfAnnotation.FLAGS_HIDDEN));
    replySticky.put(new PdfName("StateModel"), new PdfString("Marked"));
    stamper.addAnnotation(replySticky, 1);
    stamper.close();
}

Пример написан на Java, но его довольно легко адаптировать к C#. Важно знать, что пометка исходной аннотации sticky осуществляется путем добавления дополнительной аннотации replySticky. Отличие от обычной аннотации IRT заключается в том, что мы собираемся скрыть аннотацию, добавив FLAGS_HIDDEN к флагам аннотации. Мы также устанавливаем /State на Marked и /StateModel на Marked.

Этот код превращает hello_sticky_note.pdf в hello_marked.pdf, как было запрошено, но есть улов! Флажок будет виден только в том случае, если вы вошли в систему как пользователь "Bruno". Этот флажок предназначен только для личного использования.

Если вы хотите, чтобы другие видели статус обзора, вам не следует использовать функцию «Отмечено». Вместо этого вы должны использовать «Обзор». Это плохо документировано в ISO-32000. См. таблицу с заголовком «Дополнительные записи, характерные для текстовой аннотации»:

введите здесь описание изображения

Эта таблица относится к таблице с заголовком «Состояния аннотаций»:

введите здесь описание изображения

Мы использовали комбинацию StateModel = Marked; Состояние = Отмечено, что означает, что аннотация отмечена пользователем. Я не нашел в спецификации упоминания о том, что эта метка видна только на машине пользователя, пометившего документ.

Обнаружив это, я создал пример AddAccepted:

PdfAnnotation replySticky = PdfAnnotation.createText(
        writer, stickyRectangle, "Bruno", "Accepted by Bruno", false, "Comment");
replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0));
replySticky.put(PdfName.STATE, new PdfString("Accepted"));
PdfNumber n = sticky.getAsNumber(PdfName.F);
replySticky.put(PdfName.F, new PdfNumber(n.intValue() | PdfAnnotation.FLAGS_HIDDEN));
replySticky.put(new PdfName("StateModel"), new PdfString("Review"));
stamper.addAnnotation(replySticky, 1);
stamper.close();

Этот пример идентичен предыдущему, за исключением того, что теперь мы используем комбинацию: StateModel = Review; Состояние = Принято. Как видно из таблицы «Состояния аннотаций», другие возможные варианты состояния: «Отклонено», «Отменено», «Завершено» и «Нет» (значение по умолчанию).

Результат выглядит следующим образом:

введите здесь описание изображения

Как видите, на панели комментариев появилась зеленая галочка. Он показывает «Bruno Accepted» на компьютере, где вошедший в систему пользователь не является Bruno. Вы можете сами убедиться в этом здесь: hello_accepted.pdf< /а>

person Bruno Lowagie    schedule 06.06.2016
comment
Вам за ответ! Почему вы используете эту строку: answerSticky.Put(PdfName.IRT, annots.GetAsIndirectObject(0)); Потому что, когда я пишу это, я больше не вижу свой ответ на комментарий, отмеченный Бруно. И когда я его не пишу, мой ответ здесь, но проблема остается: мой ответ не помечен. - person Caryluna; 06.06.2016
comment
Не копируйте мой пример буквально. Если вы удалите ключ IRT, вы не поймете мой ответ. IRT означает In Reply To. Значение этой записи является ссылкой на аннотацию, которую необходимо пометить. В моем простом примере все просто: есть только одна аннотация, поэтому я могу взять первую annots.getAsIndirectObject(0). В вашем случае вам нужно изменить 0 на индекс аннотации, которую вы хотите пометить. Начните с примера на hello_sticky_note.pdf. Изучите, что происходит, и адаптируйте простой пример в соответствии с вашими потребностями. - person Bruno Lowagie; 06.06.2016
comment
Я скопировал ваш код с вашим примером в формате PDF hello_sticky_note.pdf, и он не работает. Ответ «Отмечено», заданный Бруно, не появляется, и отметка не слишком - person Caryluna; 06.06.2016
comment
Я сохраняю корректуру и открываю ее в Adobe Reader, но не вижу никаких пометок - person Caryluna; 06.06.2016
comment
Это потому, что вы вошли в систему как другой пользователь. Эта галочка работает только на машине того пользователя, который ее поставил. Возможно, ваш вопрос все еще неверен. Возможно, вы не хотите отмечать аннотацию. Возможно, вы захотите просмотреть аннотацию. Я обновил свой ответ. В следующий раз, когда вы зададите вопрос, вы должны быть более полезными, выражаясь более четко. Я потратил несколько сотен долларов своего времени на ваш вопрос. - person Bruno Lowagie; 06.06.2016
comment
Спасибо большое! Я попробовал ваш новый код с функциями «Обзор», и он идеален. Я не знал, что отметку видит только написавший ее пользователь, поэтому функции «Обзор» отлично адаптированы под то, что я хочу сделать. Еще раз спасибо! - person Caryluna; 08.06.2016