![](/img/trans.png)
[英]Using pdfbox in java to overlay text onto previously created pdf document
[英]Using Overlay in PDFBox 2.0
我在這里要做的是創建文本並將其放置在空白頁面上。 然后將該頁面疊加到另一個文檔上,然后將其另存為一個文檔。 在 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 中有兩個 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 源代碼,它展示了您可以用該類做什么的更多可能性。
獎金內容:
在不使用 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.