在PDFBox 2.0中使用叠加层

问题描述 投票:1回答:1

我在这里要做的是创建文本并将其放在空白页上。然后,该页面将被覆盖到另一文档上,然后将其另存为一个文档。在1.8版本中,我能够在PDF中创建一个空白的PDPage,根据需要向其中写入文本,然后将该PDF与另一个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坐标,并告诉它要写什么文本(同样,这是我的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中有两个Overlay类(org.apache.pdfbox.Overlayorg.apache.pdfbox.util.Overlay),而在2.0中只有一个。据我所知,我需要的类(org.apache.pdfbox.Overlay)或其至少提供的方法在2.0中不存在。我只能找到org.apache.pdfbox.multipdf.Overlay

java pdfbox
1个回答
6
投票

这里有一些快速的代码有效,它在文档上添加了“已弃用”并保存在其他位置:

    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>(); // empty map is a dummy
    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();
© www.soinside.com 2019 - 2024. All rights reserved.