我在这里要做的是创建文本并将其放在空白页上。然后,该页面将被覆盖到另一文档上,然后将其另存为一个文档。在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.Overlay和org.apache.pdfbox.util.Overlay),而在2.0中只有一个。据我所知,我需要的类(org.apache.pdfbox.Overlay
)或其至少提供的方法在2.0中不存在。我只能找到org.apache.pdfbox.multipdf.Overlay。
这里有一些快速的代码有效,它在文档上添加了“已弃用”并保存在其他位置:
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();