2013-07-16 16 views
6

Come posso modificare una pagina PDF con java e pdfbox scrivendo in una posizione specifica che conosco già in pixel?Modifica pagina pdf utilizzando pdfbox

ho provato questo, ma sovrascrive:

PDDocument document = null; 
try { 
    document = PDDocument.load(new File("/x/x/x/mypdf.pdf")); 
    PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(0); 
    PDFont font = PDType1Font.HELVETICA_BOLD; 
    PDPageContentStream contentStream = new PDPageContentStream(document, page); 
    page.getContents().getStream(); 
    contentStream.beginText(); 
    contentStream.setFont(font, 12); 
    contentStream.moveTextPositionByAmount(100, 100); 
    contentStream.drawString("Hello"); 
    contentStream.endText(); 
    contentStream.close(); 
    document.save("/x/x/x/mypdf.pdf"); 
    document.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (COSVisitorException e) { 
    e.printStackTrace(); 
} 

Grazie.

risposta

2

Decido che è il modo di farlo, invece di utilizzare PDFBox ho usato iTextpdf, questo è il codice Java che ho usato:

package ma; 

import java.io.*; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.pdf.*; 

public class editPdf { 

public static void main(String[] args) throws IOException, 
     DocumentException { 

    PdfReader reader = new PdfReader("/Users/Monssef/Desktop/mypdf.pdf"); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
      "/Users/Leonidas/Desktop/mypdfmodified.pdf")); 
    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, 
      BaseFont.NOT_EMBEDDED); 

     PdfContentByte over = stamper.getOverContent(1); 

     over.beginText(); 
     over.setFontAndSize(bf, 10); 
     over.setTextMatrix(107, 107); 
     over.showText("page updated"); 
     over.endText(); 

    stamper.close(); 
} 

} 
+1

Questa non è la risposta corretta alla domanda postata. –

14

Si potrebbe aver usato PDFBox, tutto quello che manca è aggiungendo al pagina. Basta cambiare questa linea:

PDPageContentStream contentStream = new PDPageContentStream(document, page); 

a:

PDPageContentStream contentStream = new PDPageContentStream(document, page, true, true); 

A partire da PDFBox 2.0, il booleanappendContent è stato sostituito dal AppendModeAPPEND in modo tale che l'equivalente del codice precedente è ora:

PDPageContentStream contentStream = new PDPageContentStream(
    document, page, PDPageContentStream.AppendMode.APPEND, true 
); 
1

Anita è corretta. In effetti funziona abbastanza bene. Vorrei aggiungere che la linea

page.getContents().getStream(); 

è forse estranea, e PDPage è in corso di ammortamento a favore delle PDPageable nelle versioni più recenti (ed è usato principalmente per la stampa), ma il codice funzionerà per il vostro scopo senza andare a la spesa di iText (e dopo tutto, originariamente hai chiesto di PDFBox).

Non dimenticate di includere la correzione Anita ha dato per creare i bit extra nella creazione di contentstream:

PDPageContentStream contentStream = new PDPageContentStream(
     document, page, true, true); 

si dovrebbe anche ricordare che vi sarà probabilmente la creazione e flussi di chiusura per ogni sezione di stampa che si posiziona sopra il pdf su cui si sovrappone il testo. Dovrai essere sicuro di chiudere entrambi i flussi e il documento in modo che i buffer siano scritti, altrimenti non vedrai le tue modifiche.

Inoltre, per chi prova questo, ci sono diverse opzioni di download di librerie da apache per pdfbox. Il più facile da usare, penso, è (attualmente) quello chiamato pdfbox-app-1.8.10.jar (che attualmente sto usando anche nelle mie app JSF). Include già le altre librerie cablate in pdfbox che è necessario anche scaricare per fare qualcosa di significativo.

+0

Il costruttore 'PDPageContentStream' con tre parametri booleani è una scelta ancora migliore. Cerca di assicurarsi che all'inizio del nuovo stream lo stato della grafica sia in uno stato predefinito. – mkl

+0

Sarei d'accordo. Non richiesto, ma è bello sapere in quale stato si trova la grafica quando fai ogni cosa che devi fare. Peccato che l'OP abbia risposto alla sua domanda ignorando la parte che ha scritto che dice "con java e pdfbox" per dare una risposta itext che ha poi accettato. Anita gli diede una risposta che funzionava e rispondeva alla domanda. – FreedomRings

Problemi correlati