我在这里试图做的是创建文本,并将其放在一个空白页上。然后将该页面覆盖到另一个文档上,然后将该文档保存为一个文档。在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坐标,并告诉它要写什么文本(同样,这是在我的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的原因是,首先,我需要保持在最近的库的顶部,而且我在将图片放到页面上也有问题(请参阅这里)。
我在这个问题上的问题是,2.0不再有类似于org.apache.pdfbox.Overlay
类的东西了。更让我困惑的是,1.8中有两个覆盖类(org.apache.pdfbox.Overlay和org.apache.pdfbox.util.Overlay),而在2.0中只有一个覆盖类。据我所知,我需要的类(org.apache.pdfbox.Overlay
)或它至少提供的方法在2.0中不存在。我只能找到org.apache.pdfbox.multipdf.Overlay。
发布于 2015-09-30 08:47:23
下面是一些有效的快速代码,它在文档上添加了“废弃”,并将其保存到其他地方:
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类的情况下也这样做,这样可以在保存文档之前对文档进行进一步的操作。
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();
https://stackoverflow.com/questions/32844926
复制相似问题