我在这里要做的是创建文本并将其放在空白页面上。然后该页面将被覆盖到另一个文档上,然后将其保存为一个文档。在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.Overlay和org.apache.pdfbox.util.Overlay)中有两个Overlay类,而2.0中只有一个。据我所知,我需要的课程(org.apache.pdfbox.Overlay
),或者它至少提供的方法,并不存在于2.0中。我只能找到org.apache.pdfbox.multipdf.Overlay。
答案 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();