使用pdfbox编辑pdf页面

如何编写带有java和pdfbox的pdf页面,通过写入我已知的像素的特定位置?

我尝试了这个,但它覆盖了:

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

谢谢。

你可以使用PDFBox,你所缺少的就是附加到页面上。 只需改变这一行:

 PDPageContentStream contentStream = new PDPageContentStream(document, page); 

至:

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

从PDFBox 2.0开始, boolean appendContent已被AppendMode APPEND取代,现在是以前代码的等价物:

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

我弄清楚如何做到这一点,而不是使用我使用的iTextpdf的 pdfbox,这是我使用的java代码:

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

安妮塔是对的。 事实上它运作得很好。 我想补充一下这条线

 page.getContents().getStream(); 

可能是无关紧要的,并且PDPage在新版本中被折旧以支持PDPageable(主要用于打印),但代码可以用于您的目的,而不需要花费iText(毕竟,您最初询问的是PDFBox的)。

不要忘记包含修复Anita在创建contentstream时创建额外位的修复:

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

您还应该记住,您可能会为放置在文本上的pdf上的每个打印部分创建和关闭流。 您需要确保关闭流和文档以便写入缓冲区,否则您将看不到更改。

此外,对于那些尝试这一点的人,有几种从apache下载pdfbox库的选项。 我认为最容易使用的是(目前)名为pdfbox-app-1.8.10.jar的 (我目前在我的JSF应用程序中使用它)。 它已经包含了硬连接到pdfbox的其他库,您还需要下载它们以执行任何有意义的操作。