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

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

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

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

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

Спасибо

2 ответа

Решение

Если вы хотите немного обмануть, вы можете использовать ссылку... которую 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. Поиск этого поля по имени в хеш-таблице iTroxt AcroFields, используя getField;
  2. Создайте новую подпись, используя pdf stamper, и установите ее геометрию на основе значений старого объекта поля; а также
  3. Удалите старое поле, используя removeField.
Другие вопросы по тегам