Java 使用pdfbox编辑pdf页面

Java 使用pdfbox编辑pdf页面,java,edit,pdfbox,Java,Edit,Pdfbox,如何使用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 =

如何使用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,这是我使用的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();
}

}

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

PDPageContentStream contentStream = new PDPageContentStream(document, page);
致:

从PDFBox 2.0开始,
boolean
appendContent
已被
AppendMode
APPEND
所取代,因此先前代码的等价物现在为:

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

安妮塔是对的。事实上,它工作得相当好。我想补充一句

page.getContents().getStream();
可能是无关的,在较新的版本中,PDPage被降价为PDPageable(主要用于打印),但代码将为您的目的工作,而不会花费iText(毕竟,您最初询问的是PDFBox)

别忘了包括Anita在创建contentstream时为创建额外比特而提供的修复:

PDPageContentStream contentStream = new PDPageContentStream(
        document, page, true, true);
您还应该记住,您可能会创建和关闭打印的每个部分的流,这些部分放在您覆盖文本的pdf上。您需要确保同时关闭流和文档,以便写入缓冲区,否则将看不到更改


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

带有三个布尔参数的
PDPageContentStream
构造函数是更好的选择。它试图确保在新流开始时,图形状态处于默认状态。我同意这一点。不是必需的,但是当你做每件你需要做的事情时,知道图形处于什么状态是很好的。糟糕的是,OP在回答自己的问题时忽略了他写的“使用java和pdfbox”的部分,而给出了一个他随后接受的itext答案。安妮塔给了他一个有效且符合问题的答案。这不是对张贴的问题的正确答案。
PDPageContentStream contentStream = new PDPageContentStream(
        document, page, true, true);