Координаты элемента в PDF-файле с использованием iText

StackOverflow https://stackoverflow.com/questions/1611210

Вопрос

Я создаю PDF-файл, используя РОЖДЕНИЕ библиотека отчетов.Позже мне нужно будет подписать эти файлы цифровой подписью.я использую iText поставить цифровую подпись на документе.

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

В конце концов мне нужно, чтобы в каждом отчете было указано, где мне нужно поставить подпись.Затем мне нужно прочитать местоположение с помощью iText, а затем разместить подпись в этом месте.

Можно ли этого добиться с помощью BIRT и iText?

Спасибо

Это было полезно?

Решение

Если вы готовы немного схитрить, вы можете использовать ссылку...которые поддерживает BIRT, согласно моему небольшому погружению в их документацию.

Ссылка — это аннотация.К сожалению, iText не поддерживает проверку аннотаций на высоком уровне, а только их создание, поэтому вам придется использовать вызовы объектов низкого уровня.

Код для его извлечения может выглядеть примерно так:

// getPageN is looking for a page number, not a page index
PdfDictionary lastPageDict = myReader.getPageN(myReader.getNumberOfPages());

PdfArray annotations = lastPageDict.getAsArray( PdfName.ANNOTS );
PdfArray linkRect = null;
if (annotations != null) {
  int numAnnots = annotations.size();
  for (int i = 0; i < numAnnots; ++i) {
    PdfDictionary annotDict = annotations.getAsDict( i );
    if (annotDict == null) 
      continue; // it'll never happen, unless you're dealing with a Really Messed Up PDF.

    if (PdfName.LINK.equals( annotDict.getAsName( PdfName.SUBTYPE ) )) {
      // if this isn't the only link on the last page, you'll have to check the URL, which
      // is a tad more work.
      linkRect = annotDict.getAsArray( PdfName.RECT );

      // a little sanity check here wouldn't hurt, but I have yet to come across a PDF
      // that was THAT screwed up, and I've seen some Really Messed Up PDFs over the years.

      // and kill the link, it's just there for a placeholder anyway.
      // iText doesn't maintain any extra info on links, so no need for other calls.
      annotations.remove( i ); 
      break;
    }
  }
}

if (linkRect != null) {
  // linkRect is an array, thusly: [ llx, lly, urx, ury ].
  // you could use floats instead, but I wouldn't go with integers.  
  double llx = linkRect.getAsNumber( 0 ).getDoubleValue(); 
  double lly = linkRect.getAsNumber( 1 ).getDoubleValue();
  double urx = linkRect.getAsNumber( 2 ).getDoubleValue();
  double ury = linkRect.getAsNumber( 3 ).getDoubleValue();

  // make your signature
  magic();
}

Если BIRT генерирует некоторый текст в содержимом страницы под ссылкой для своего визуального представления, это незначительная проблема.Ваша подпись должна полностью закрывать его.

Конечно, было бы лучше, если бы вы могли сгенерировать подпись непосредственно из BIRT, но мой небольшой осмотр их документов не придал мне уверенности в их способностях настройки PDF...несмотря на то, что они сидят поверх iText.Это генератор отчетов, который может создавать PDF-файлы...мне не следует ожидать слишком много.`

Редактировать:Если вам нужно найти конкретный URL-адрес, вам следует просмотреть раздел «12.5.6.5 Аннотации ссылок» Справочника PDF, который можно найти здесь:http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf

Другие советы

Я ничего не знаю о BIRT и лишь немного знаком с iText.Но, возможно, это сработает...

Может ли BIRT создать структуру поля для подписи как обычное поле формы с заданным именем поля?Если да, то вы сможете:

  1. Найдите это поле по имени в хэш-карте AcroFields iText, используя getField;
  2. Создайте новую подпись с помощью штампа PDF и задайте ее геометрию на основе значений старого объекта поля;и
  3. Удалите старое поле с помощью команды RemoveField.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top