2013-07-16 12 views
6

Jak mogę edytować stronę pdf za pomocą java i pdfbox pisząc w określonej pozycji, którą już znam w pikselach?Edycja strony pdf za pomocą pdfbox

próbowałem tego, ale to nadpisuje:

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

Dziękuję.

Odpowiedz

2

mi zrozumieć to, jak to zrobić, zamiast korzystania PDFBox użyłem iTextpdf, jest to kod Java użyłem:

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

To nie jest poprawna odpowiedź na przesłane pytanie. –

14

Mogłeś wykorzystywane PDFBox, wszystko, czego brakuje jest dołączenie do strona. Wystarczy zmienić tę linię:

PDPageContentStream contentStream = new PDPageContentStream(document, page); 

do:

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

Począwszy od PDFBox 2.0, booleanappendContent został zastąpiony przez AppendModeAPPEND takie, że odpowiednikiem poprzedniego kodu jest teraz:

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

Anita jest poprawna. W rzeczywistości działa całkiem dobrze. Dodam, że linia

page.getContents().getStream(); 

jest ewentualnie obcy i PDPage jest amortyzowany na rzecz PDPageable w nowszych wydaniach (i jest używana głównie do drukowania), ale kod będzie pracować dla celów bez uciekania się do koszt iText (i ostatecznie, pierwotnie zapytałeś o PDFBox).

Nie zapomnij dołączyć poprawkę Anita dał do tworzenia dodatkowych bitów w tworzeniu contentstream:

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

Należy również pamiętać, że będzie prawdopodobnie tworzenia i strumienie zamknięcia dla każdej sekcji druku które umieszczasz na górze pliku PDF, na którym nakładasz tekst. Konieczne będzie zamknięcie zarówno strumieni, jak i dokumentu, tak aby zapisywane były bufory, w przeciwnym razie zmiany nie będą widoczne.

Ponadto, dla osób, które wypróbowują to, istnieje kilka opcji pobierania bibliotek z Apache dla pdfbox. Najłatwiejszy do użycia, jak sądzę, jest (obecnie) ten o nazwie pdfbox-app-1.8.10.jar (którego używam obecnie nawet w moich aplikacjach JSF). Zawiera już inne biblioteki, które są podłączone do PDF-a, które również musisz pobrać, aby zrobić cokolwiek znaczącego.

+0

Konstruktor 'PDPageContentStream' z trzema parametrami boolowskimi jest jeszcze lepszym wyborem. Próbuje upewnić się, że na początku nowego strumienia stan grafiki jest w stanie domyślnym. – mkl

+0

Zgodziłbym się z tym. Nie jest to wymagane, ale dobrze jest wiedzieć, w jakim stanie znajduje się grafika, gdy wykonujesz każdą czynność, którą musisz wykonać. Szkoda, że ​​OP odpowiedział na własne pytanie, ignorując część, którą napisał, "z java i pdfbox", by dać odpowiedź itextową, którą następnie zaakceptował. Anita podała mu odpowiedź, która zadziałała i pasowała do pytania. – FreedomRings

Powiązane problemy