使用pdfbox编辑pdf页面

时间:2013-07-16 19:15:23

标签: 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 = 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();
}

谢谢。

3 个答案:

答案 0 :(得分:17)

您可以使用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
);

答案 1 :(得分:2)

我弄明白该怎么做,而不是使用我使用的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();
}

}

答案 2 :(得分:1)

Anita是对的。事实上它运作得很好。我想添加一行

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的其他库,您还需要下载它们以执行任何有意义的操作。