2013-07-16 36 views
6

Làm cách nào tôi có thể chỉnh sửa trang pdf bằng java và pdfbox bằng cách viết ở vị trí cụ thể mà tôi biết đã có bằng pixel?Chỉnh sửa trang pdf bằng cách sử dụng pdfbox

tôi đã cố gắng này, nhưng nó ghi đè:

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

Cảm ơn bạn.

Trả lời

2

Tôi hình dung nó ra làm thế nào để làm điều đó, thay vì sử dụng pdfbox i sử dụng iTextpdf, đây là mã java i sử dụng:

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

Đây không phải là câu trả lời đúng cho câu hỏi được đăng. –

14

Bạn có thể đã sử dụng PDFBox, tất cả các bạn đang thiếu là phụ thêm vào trang. Chỉ cần thay đổi dòng này:

PDPageContentStream contentStream = new PDPageContentStream(document, page); 

tới:

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

Bắt đầu từ PDFBox 2.0, các booleanappendContent đã được thay thế bằng AppendModeAPPEND như vậy tương đương với mã trước bây giờ là:

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

Anita là chính xác. Trong thực tế, nó hoạt động khá tốt. Tôi muốn nói thêm rằng dòng

page.getContents().getStream(); 

có thể là không liên quan, và PDPage đã được khấu hao ủng hộ PDPageable trong các phiên bản mới hơn (và được sử dụng chủ yếu cho in ấn), nhưng mã sẽ làm việc cho mục đích của bạn mà không đi đến chi phí của iText (và sau khi tất cả, ban đầu bạn hỏi về PDFBox).

Đừng quên bao gồm việc sửa chữa Anita đã tạo các bit thêm trong việc tạo ra contentstream:

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

Bạn cũng nên nhớ rằng bạn có thể sẽ được tạo ra và suối đóng cho mỗi phần của in mà bạn đặt trên đầu trang của pdf bạn đang phủ lên văn bản. Bạn sẽ cần phải chắc chắn đóng cả hai luồng và tài liệu để các bộ đệm được viết, nếu không bạn sẽ không thấy các thay đổi của mình.

Ngoài ra, đối với những người dùng thử điều này, có một số tùy chọn tải xuống thư viện từ apache cho pdfbox. Cách dễ nhất để sử dụng, tôi nghĩ, là (hiện tại) cái tên là pdfbox-app-1.8.10.jar (mà tôi hiện đang sử dụng ngay cả trong các ứng dụng JSF của tôi). Nó đã bao gồm các thư viện khác có dây cứng vào pdfbox mà bạn cũng sẽ cần phải tải xuống để làm bất cứ điều gì có ý nghĩa.

+0

Hàm tạo 'PDPageContentStream' với ba tham số boolean là một lựa chọn tốt hơn. Nó cố gắng đảm bảo rằng ở đầu luồng mới trạng thái đồ họa ở trạng thái mặc định. – mkl

+0

Tôi đồng ý với điều đó. Không cần thiết, nhưng nó là tốt đẹp để biết những gì nhà nước đồ họa là trong khi bạn làm mỗi điều mà bạn cần phải làm. Nó quá tệ đến nỗi OP trả lời câu hỏi của chính mình bằng cách bỏ qua phần anh viết mà nói "với java và pdfbox" để đưa ra một câu trả lời sau đó anh ta chấp nhận. Anita đưa cho anh một câu trả lời phù hợp với câu hỏi. – FreedomRings