2017-08-22 6 views
0

Je travaille sur un fichier pdf. J'ai besoin d'ajouter un filigrane sur un fichier PDF existant. C'est pourquoi, j'ai écrit le code suivant. Quand j'ai utilisé FileOutputStream, cela fonctionne parfaitement, mais j'ai besoin d'utiliser ByteArrayOutputStream parce que mes données proviennent de la base de données et que je dois les sauvegarder sous forme de tableau d'octets. Le problème commence ici. Lorsque j'utilise la méthode ByteArrayOutputStream getOvercontent de PdfStamper renvoie null. Comment puis-je gérer cela? Merci d'avance. Itext PdfStamper getOverContent renvoie null lorsque ByteArrayOutputStream est utilisé

byte[] bytes = getAsByteArray(); 
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length); 
PdfReader reader = new PdfReader(bytes); 
int numberOfPages= reader.getNumberOfPages(); 
outputStream.write(bytes, 0, bytes.length); 
PdfStamper stamper = new PdfStamper(reader, outputStream); 
Font font = font(Font.NORMAL, 135, Color.RED); 
for (int i = 0; i < numberOfPages; i++) { 
    //over Content is null 
    PdfContentByte over = stamper.getOverContent(i); 
    Phrase p = new Phrase("WATERMARK", font); 
    PdfGState gs = new PdfGState(); 
    gs.setFillOpacity(0.5f); 
    over.setGState(gs); 
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); 
    over.saveState(); 
} 

Et l'ancienne version du code est cela.

byte[] bytes = FileUtils.readFileToByteArray(new File("myPdf.pdf")); 
PdfReader reader = new PdfReader(bytes); 
int numberOfPages= reader.getNumberOfPages(); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("MyPdfOut.pdf")); 
Font f = font(Font.NORMAL, 135, Color.RED); 
for (int i = 1; i <= numberOfPages; i++) { 
    PdfContentByte over = stamper.getOverContent(i); 
    Phrase p = new Phrase("WATERMARK", f); 
    PdfGState gs = new PdfGState(); 
    gs.setFillOpacity(0.5f); 
    over.setGState(gs); 
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); 
    over.saveState(); 
} 

Répondre

1

C'est interdit:

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length); 
outputStream.write(bytes, 0, bytes.length); 
PdfStamper stamper = new PdfStamper(reader, outputStream); 

Vous créez un OutputStream, nommé outputStream, et il semble que la copie d'un fichier PDF existant à part entière à cette OutputStream (en utilisant write()). Ensuite, vous semblez avoir l'intention d'ajouter un autre fichier PDF complet à ce OutputStream en passant le même OutputStream à l'instance PdfStamper. Cela devrait entraîner un fichier PDF corrompu.

Cela se traduira également par la syntaxe PDF illégale:

PdfContentByte over = stamper.getOverContent(i); 
Phrase p = new Phrase("WATERMARK"); 
PdfGState gs = new PdfGState(); 
gs.setFillOpacity(0.5f); 
over.setGState(gs); 
ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); 
over.saveState(); 

Vous avez un opérateur saveState(), mais vous ne jamais utiliser restoreState(). Pour chaque saveState(), vous devriez avoir un restoreState(). Votre saveState() est dans la mauvaise position! C'est comme si vous ne savez pas ce que sont saveState() et restoreState(). Enfin, vous commencez à compter un 0, mais la première page est la page 1, pas la page 0. Par conséquent est incorrect. Il devrait être for (int i = 1; i <= numberOfPages; i++). Cette erreur est la cause overnull.

Ceci est une tentative de corriger votre code:

// create a Phrase with a certain font 
Font font = font(Font.NORMAL, 135, Color.RED); 
Phrase p = new Phrase("WATERMARK", font); 
// Create a reader and a stamper 
PdfReader reader = new PdfReader(getAsByteArray()); 
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
PdfStamper stamper = new PdfStamper(reader, outputStream); 
int numberOfPages= reader.getNumberOfPages(); 
for (int i = 1; i <= numberOfPages; i++) { 
    PdfContentByte over = stamper.getOverContent(i); 
    over.saveState(); 
    PdfGState gs = new PdfGState(); 
    gs.setFillOpacity(0.5f); 
    over.setGState(gs); 
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); 
    over.restoreState(); 
} 
+0

Merci pour votre aide. C'était très douloureux 5 heures. –