Pregunta

Estoy creando un archivo pdf utilizando la biblioteca de informes BIRT . Luego necesito firmar digitalmente estos archivos. Estoy usando iText para firmar digitalmente el documento.

El problema al que me enfrento es que debo colocar la firma en diferentes lugares en diferentes informes. Ya tengo el código para firmar digitalmente el documento, ahora siempre estoy colocando la firma en la parte inferior de la última página en cada informe.

Eventualmente necesito que cada informe diga dónde debo colocar la firma. Luego debo leer la ubicación utilizando iText y luego colocar la firma en esa ubicación.

¿Es posible lograr esto utilizando BIRT y iText

Gracias

¿Fue útil?

Solución

Si estás dispuesto a hacer trampa, puedes usar un enlace ... que BIRT admite de acuerdo con mi pequeña inmersión en sus documentos en este momento.

Un enlace es una anotación. Lamentablemente, iText no admite el examen de anotaciones a un alto nivel, solo las genera, por lo que tendrá que usar las llamadas a objetos de bajo nivel.

El código para extraerlo podría tener este aspecto:

// 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();
}

Si BIRT genera algún texto en el contenido de la página bajo el enlace para su representación visual, eso es solo un problema menor. Tu firma debe cubrirla completamente.

Definitivamente eres mejor si puedes generar la firma directamente desde BIRT en primer lugar, pero mi pequeña inspección de sus documentos no me llenó de confianza en sus capacidades de personalización de PDF ... a pesar de estar arriba de ti mismo ellos mismos. Es un generador de informes que puede producir archivos PDF ... No debería esperar mucho también . `

Editar: si necesita buscar la URL específica, querrá consultar la sección " 12.5.6.5 Anotaciones de enlaces " de la Referencia en PDF, que se puede encontrar aquí: http://www.adobe.com/content /dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf

Otros consejos

No sé nada acerca de BIRT, y tengo un poco de familiaridad con iText. Pero tal vez esto funcione ...

¿Puede BIRT generar el contorno del cuadro de firma como un campo de formulario regular con un nombre de campo dado? Si es así, entonces deberías poder:

  1. Busque ese campo por nombre en el hashmap AcroFields de iText, usando getField;
  2. Cree una nueva firma con el sello de pdf y configure su geometría según los valores del objeto de campo antiguo; y
  3. Elimine el campo anterior usando removeField.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top