Вопрос вызвал некоторую путаницу из-за терминологии «отметить/снять отметку» в контексте текстовой (или заметки) аннотации. Правильная терминология была бы следующей: Как пометить/снять пометку с текстовой аннотации?
Установка/снятие флажка сразу же заставляет задуматься о флажках, но следующий снимок экрана показывает, что имеется в виду, когда мы говорим о пометке текстовой аннотации:
![введите здесь описание изображения](https://i.stack.imgur.com/GSOJW.png)
Пометка текстовой аннотации — это не вопрос установки флажка. Пометка текстовой аннотации выполняется путем добавления скрытой аннотации «В ответе на» (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. См. таблицу с заголовком «Дополнительные записи, характерные для текстовой аннотации»:
![введите здесь описание изображения](https://i.stack.imgur.com/X8irU.png)
Эта таблица относится к таблице с заголовком «Состояния аннотаций»:
![введите здесь описание изображения](https://i.stack.imgur.com/Jb7kd.png)
Мы использовали комбинацию 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; Состояние = Принято. Как видно из таблицы «Состояния аннотаций», другие возможные варианты состояния: «Отклонено», «Отменено», «Завершено» и «Нет» (значение по умолчанию).
Результат выглядит следующим образом:
![введите здесь описание изображения](https://i.stack.imgur.com/6K5pF.png)
Как видите, на панели комментариев появилась зеленая галочка. Он показывает «Bruno Accepted» на компьютере, где вошедший в систему пользователь не является Bruno. Вы можете сами убедиться в этом здесь: hello_accepted.pdf< /а>
person
Bruno Lowagie
schedule
06.06.2016