Координаты элемента в файле PDF с использованием iText - PullRequest
2 голосов
/ 23 октября 2009

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

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

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

Достигается ли это при использовании BIRT и iText

Спасибо

Ответы [ 2 ]

3 голосов
/ 20 октября 2010

Если вы хотите немного обмануть, вы можете использовать ссылку ... которую 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 ... несмотря на то, что я был на вершине Сами по себе. Это генератор отчетов, который может создавать PDF-файлы ... Я не должен ожидать, что слишком много. `

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

1 голос
/ 15 апреля 2010

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

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

  1. Поиск этого поля по имени в хеш-карте iText AcroFields с использованием getField;
  2. Создайте новую подпись, используя штамп PDF, и установите ее геометрию на основе значений старого объекта поля; и
  3. Удалить старое поле, используя removeField.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...