簡體   English   中英

在 PDFBox 2.0 中使用疊加

[英]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.Overlayorg.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM