Pergunta

Estou criando um arquivo pdf usando BIRT biblioteca de relatórios. Mais tarde eu preciso assinar digitalmente esses arquivos. Estou usando iText para assinar digitalmente o documento.

O problema que estou enfrentando é, eu preciso colocar a assinatura em lugares diferentes em diferentes relatórios. Eu já tenho o código para assinar digitalmente o documento, agora eu estou sempre colocando a assinatura na parte inferior da última página em cada relatório.

Finalmente eu preciso cada relatório para dizer onde eu preciso colocar a assinatura. Então eu tenho que ler o local usando iText e, em seguida, colocar a assinatura no local.

Isso é possível de alcançar usando BIRT e iText

Graças

Foi útil?

Solução

Se você está disposto a enganar um pouco, você pode usar um link ... que suporta BIRT de acordo com o meu pequeno mergulho em suas docs agora.

Um link é uma anotação. Infelizmente, iText não suporta examinando anotações em um nível elevado, apenas a gerá-los, então você terá que usar as chamadas de objetos de baixo nível.

O código para extraí-lo poderia ser algo como isto:

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

Se BIRT gera algum texto no conteúdo da página sob o link para sua representação visual, isso é apenas uma questão menor. Sua assinatura deve cobri-lo completamente.

Você é definitivamente melhor de se você pode gerar a assinatura diretamente do BIRT em primeiro lugar, mas a minha pequena inspeção de seus docs não exatamente me enchem de confiança nas suas capacidades de personalização PDF ... apesar de estar no topo de iText si. É um gerador de relatórios que passa a ser capaz de produzir PDFs ... Eu não deve esperar muito muito. `

Edit: Se você precisa de olhar para a URL específica, você vai querer olhar para a seção "12.5.6.5 Fazer a ligação Anotações" do PDF de referência, que pode ser encontrado aqui: http://www.adobe.com/content /dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf

Outras dicas

Eu não sei nada sobre BIRT, e ter apenas um pouco de familiaridade com iText. Mas talvez isso funciona ...

Can BIRT gerar contorno da caixa de assinatura como um campo de formulário regular com um determinado nome de campo? Se assim for, então você deve ser capaz de:

  1. Lookup esse campo pelo nome em AcroFields hashmap do iText, usando getField;
  2. Criar uma nova assinatura usando o batedor pdf, e definir sua geometria com base nos valores do objeto antigo campo; e
  3. Excluir o antigo campo usando RemoveField.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top