2015-09-01 3 views
1

Le pdf est stocké dans une base de données sous la forme d'un octet []. Je veux ajouter un filigrane au fichier pdf et stocker le fichier estampé sous la forme d'un octet [], également dans la base de données. C'est une application Grails, donc le code est en Groovy. Ici, il est:Ajouter un filigrane au pdf en utilisant iText en utilisant ByteArrayOutputStream

def stampDocument(byte[] orig) { 
    PdfReader pdfReader = new PdfReader(orig) 
    ByteArrayOutputStream baos = new ByteArrayOutputStream() 
    //baos.write(orig, 0, orig.size()) 
    PdfStamper pdfStamper = new PdfStamper(pdfReader, baos) 
    com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(new URL("http://localhost:8080/IDSG/assets/stamp.jpg")); 
    image.setAbsolutePosition(65f, 10f); 
    image.scalePercent(40f); 
    int i = 1 
    while(i <= pdfReader.getNumberOfPages()){ 
     PdfContentByte content = pdfStamper.getUnderContent(i) 
     content.addImage(image) 
     i++ 
    } 
    return baos.toByteArray() 
} 

Le problème est semble que le pdfStamper ne pas prendre connaissance du pdfReader. L'appel de certaines méthodes (getFileLength() et getInfo()) sur pdfReader renvoie des données valides, de sorte que pdfReader semble être OK. Même avec l'image.

Si le code commenté (baos.write (orig, 0, orig.size()) est décommenté, le fichier d'origine est enregistré en tant que fichier estampé, mais sans le filigrane: il est un peu plus grand que l'original, mais affiche parfaitement.

avec le code mentionné ci-dessus commenté, comme dans l'exemple de code, l'octet retourné [] est beaucoup plus petit que l'original et non un fichier PDF valide.

Cela a bien fonctionné avec des fichiers sur le disque Mais je suis perplexe ici, il semble que seulement quelque chose de petit est nécessaire.Toute aide sera appréciée.J'ai lutté avec cela pendant des heures et fouillé le web

Répondre

0

Tu oublies une ligne importante:

pdfStamper.close() 

Insérez juste avant cette ligne:

return baos.toByteArray() 

Lorsque vous fermez la Stamper, des objets tels que le dictionnaire racine et le flux de référence croisée sont écrits le OutputStream. Sans ces objets, vous n'avez pas de fichier PDF complet.

+0

Bruno, Merci pour votre réponse. Fermer ne ferme pas seulement la matrice, mais écrit tout au baos. Fermer a jeté cette erreur: –

+0

En effet: vous voulez que tout soit écrit dans le 'baos' (sinon vous avez un fichier PDF incomplet). L'erreur que vous obtenez est liée aux données XMP. Quelle version d'iText utilisez-vous? Je n'ai pas vu cette erreur depuis très longtemps. Aussi: êtes-vous sûr que les métadonnées XMP du PDF original sont correctes? Il semble que l'analyseur XMP d'Adobe ne peut pas l'analyser. –

+0

Salut Bruno, Désolé pour tanking si longtemps à revenir. Il a été téléchargé depuis le site 5.5.6. Je l'ai eu à travailler même avec le code Groovy, mais en utilisant le Itext fourni dans Grails, une version plus ancienne. –

0

Fermer a lancé cette erreur:

> Caused by AbstractMethodError: 
> javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V 
> ->> 423 | createDocumentBuilderFactory in com.itextpdf.xmp.impl.XMPMetaParser 
> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |  71 | <clinit> in  '' | 167 | parseFromBuffer in com.itextpdf.xmp.XMPMetaFactory | 153 | parseFromBuffer in  '' | 
> 350 | close . . in com.itextpdf.text.pdf.PdfStamperImp | 208 | 
> close  in com.itextpdf.text.pdf.PdfStamper 

recherches m'a amené à Grails ou Java comme la cause. J'utilise JDK8 et le dernier itext jar - 5.5.6. Grails a un ancien iText.jar - 2.0.8. C'est toujours com.lowagie. En changeant les imports et en utilisant le Bouncycastle fourni par Grails et non un service Grails, mais une vraie classe Java, j'ai enfin réussi à le faire fonctionner parfaitement.

Voici le code de travail complet:

import com.lowagie.text.Image; 
import com.lowagie.text.pdf.PdfContentByte; 
import com.lowagie.text.pdf.PdfReader; 
import com.lowagie.text.pdf.PdfStamper; 
import java.io.ByteArrayOutputStream; 
import java.net.URL; 
import java.io.IOException; 

public class Stamper { 
    public Stamper(){ 
    } 

    public byte[] stampDocument(byte[] orig) { 
     try{ 
      PdfReader pdfReader = new PdfReader(orig); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      PdfStamper pdfStamper = new PdfStamper(pdfReader, baos); 
      Image image = Image.getInstance(new URL("http://localhost:8080/IDSG/assets/stamp.jpg")); 
      image.setAbsolutePosition(70f, 10f); 
      image.scalePercent(40f); 
      for(int i=1; i<= pdfReader.getNumberOfPages(); i++){ 
       PdfContentByte content = pdfStamper.getUnderContent(i); 
       content.addImage(image); 
      } 

      pdfStamper.close(); 

      return baos.toByteArray(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     }catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
}