在PDFBox 2.0中使用叠加

时间:2015-09-29 13:11:37

标签: java pdfbox

我在这里要做的是创建文本并将其放在空白页面上。然后该页面将被覆盖到另一个文档上,然后将其保存为一个文档。在1.8中我能够在PDF中创建一个空白的PDPage,根据需要将文本写入其中,然后将该PDF与另一个重叠,然后使用下面的代码保存或在屏幕上查看 -

overlayDoc = new PDDocument();
page = new PDPage();
overlayDoc.addPage(page);
overlayObj = new Overlay();
font = PDType1Font.COURIER_OBLIQUE;
try {
    contentStream = new PDPageContentStream(overlayDoc, page);
    contentStream.setFont(font, 10);
}
catch (Exception e){
    System.out.println("content stream failed");
}

在我创建了流之后,当我需要在覆盖文档的contentStream中写一些东西时,我会调用这个方法,给它我的x,y coords并告诉它要写什么文本(再次,这是在我的1.8版本中):

protected void writeString(int x, int y, String text) {
    if (text == null) return;
    try {
        contentStream.moveTo(x, y);
        contentStream.beginText();
        contentStream.drawString(text);  // deprecated. Use showText(String text)
        contentStream.endText();
    }
    catch (Exception e){
        System.out.println(text + " failed. " + e.toString());
    }
}

每当我需要添加文本时,我都会调用此方法,并且无论何时需要这样做。在此之后,我将关闭我的内容流,然后将文档合并在一起:

import org.apache.pdfbox.Overlay;
Overlay overlayObj = new Overlay();

....

PDDocument finalDoc = overlayObj.overlay(overlayDoc, originalDoc);

finalDoc 现在包含一个PDDocument,它是我的原始PDF文本,文本覆盖在需要的位置。我可以保存它并在桌面上将其视为BufferedImage。我之所以迁移到2.0是因为首先我需要保持最新的库,并且我在将图像放到页面上时遇到了问题(参见here)。

我在这个问题中遇到的问题是2.0不再具有与org.apache.pdfbox.Overlay类相似的东西。让我更加困惑的是,1.8(org.apache.pdfbox.Overlayorg.apache.pdfbox.util.Overlay)中有两个Overlay类,而2.0中只有一个。据我所知,我需要的课程(org.apache.pdfbox.Overlay),或者它至少提供的方法,并不存在于2.0中。我只能找到org.apache.pdfbox.multipdf.Overlay

1 个答案:

答案 0 :(得分:5)

以下是一些有效的快速代码,它在文档中添加“已弃用”并将其保存在其他位置:

    PDDocument overlayDoc = new PDDocument();
    PDPage page = new PDPage();
    overlayDoc.addPage(page);
    Overlay overlayObj = new Overlay();
    PDFont font = PDType1Font.COURIER_OBLIQUE;

    PDPageContentStream contentStream = new PDPageContentStream(overlayDoc, page);
    contentStream.setFont(font, 50);
    contentStream.setNonStrokingColor(0);
    contentStream.beginText();
    contentStream.moveTextPositionByAmount(200, 200);
    contentStream.drawString("deprecated");  // deprecated. Use showText(String text)
    contentStream.endText();
    contentStream.close();

    PDDocument originalDoc = PDDocument.load(new File("...inputfile.pdf"));
    overlayObj.setOverlayPosition(Overlay.Position.FOREGROUND);
    overlayObj.setInputPDF(originalDoc);
    overlayObj.setAllPagesOverlayPDF(overlayDoc);
    Map<Integer, String> ovmap = new HashMap<Integer, String>();
    overlayObj.setOutputFile("... result-with-overlay.pdf");
    overlayObj.overlay(ovmap);
    overlayDoc.close();
    originalDoc.close();

我对你的版本做了什么:

  • 声明变量
  • 关闭内容流
  • 设置颜色
  • 设置为前台
  • 设置文本位置(不是笔划路径位置)
  • 添加空地图

当然,我读了OverlayPDF source code,它显示了你可以用这个课程做的更多可能性。

奖金内容:

在不使用Overlay类的情况下执行相同的操作,该类允许在保存文档之前进一步操作文档。

    PDFont font = PDType1Font.COURIER_OBLIQUE;
    PDDocument originalDoc = PDDocument.load(new File("...inputfile.pdf"));
    PDPage page1 = originalDoc.getPage(0);
    PDPageContentStream contentStream = new PDPageContentStream(originalDoc, page1, true, true, true);
    contentStream.setFont(font, 50);
    contentStream.setNonStrokingColor(0);
    contentStream.beginText();
    contentStream.moveTextPositionByAmount(200, 200);
    contentStream.drawString("deprecated");  // deprecated. Use showText(String text)
    contentStream.endText();
    contentStream.close();
    originalDoc.save("....result2.pdf");
    originalDoc.close();