首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PDFBox 2.0中使用覆盖

在PDFBox 2.0中使用覆盖
EN

Stack Overflow用户
提问于 2015-09-29 13:11:36
回答 1查看 11.9K关注 0票数 1

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

代码语言:javascript
运行
复制
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版本中):

代码语言:javascript
运行
复制
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());
    }
}

每当需要添加文本时,只要需要添加文本,我都会调用该方法。在此之后,我将关闭我的内容流,然后将文档合并成这样:

代码语言:javascript
运行
复制
import org.apache.pdfbox.Overlay;
Overlay overlayObj = new Overlay();

....

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

finalDoc现在包含一个PDDocument,它是我最初的PDF格式,在需要的地方覆盖文本。我可以保存它,并将其视为桌面上的BufferedImage。我转到2.0的原因是,首先,我需要保持在最近的库的顶部,而且我在将图片放到页面上也有问题(请参阅这里)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-30 08:47:23

下面是一些有效的快速代码,它在文档上添加了“废弃”,并将其保存到其他地方:

代码语言:javascript
运行
复制
    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源代码,它展示了更多的可能性,你可以用这个类做什么。

奖金内容:

在不使用Overlay类的情况下也这样做,这样可以在保存文档之前对文档进行进一步的操作。

代码语言:javascript
运行
复制
    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();
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32844926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档