Java PDFBoxを使って既存PDFにページ番号を連番で付与してみた

スポンサーリンク

PDFBoxを使って既存PDFにページ番号を付与してみた

PDFBoxというライブラリを使用して、既存PDFを読み込んでページ番号を付与してみたいと思います。
あまりappendモードで作成してる記事がないので参考になれば幸いです。

まずは準備、pom.xmlに依存関係を追加しましょう。

<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.12</version>
</dependency>

コード全体

今回は、初めに3ページのPDFを1つ「oregairu.pdf」という名前で作成します。

作成したのちに、作成したPDFをロードしてページ番号を連番でふっていく処理を行っています。

さっそく、以下がコード全体です。

package pdfinput;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;

public class PdfInput {
  private static final String FONT_ARIALUNI = "C:/Windows/Fonts/ARIALUNI.TTF";
  private static final String FILE_PATH = "C:\\tmp\\oregairu.pdf";
  public static void main(String[] args) {
    
    PdfInput pdfInput = new PdfInput();
    //3ページのPDFを新規作成して保存
    pdfInput.pdfNewCreate();
    
    //新規作成したPDFを再度読み込んでページ番号を付与
    pdfInput.pdfLoadAndSerialNumber();
    
  }
  
  //3ページのPDFを新規作成
  private void pdfNewCreate() {
    
    //PDFの各ページに出力する文字列。
    List<String> pdfText = Arrays.asList("雪ノ下雪乃","由比ヶ浜結衣","一色いろは");
    
    try(PDDocument doc = new PDDocument()){
      for(String text : pdfText) {
        PDPage page = new PDPage();
        doc.addPage(page);
        try(PDPageContentStream content = new PDPageContentStream(doc, page)){
          PDFont font = PDType0Font.load(doc, new File(FONT_ARIALUNI));
          content.beginText();
          content.setFont(font,12);
          content.newLineAtOffset(100f, 500f);
          content.showText(text);
          content.endText();
          font = null;
        }catch(IOException ex) {
          ex.printStackTrace();
        }
      }
      doc.save(FILE_PATH);
    }catch(IOException ex) {
      ex.printStackTrace();
    }  
  }
  //既存PDF連番付与処理
  private void pdfLoadAndSerialNumber() {
    File file = new File(FILE_PATH);
    
    try(PDDocument doc = PDDocument.load(file)){
      PDFont font = PDType0Font.load(doc, new File(FONT_ARIALUNI));
      int count = 1;
      
      //既存PDFの各ページに対して処理を行う
      for(PDPage page : doc.getPages()) {
        StringBuilder serialNumberText = new StringBuilder();
        try(PDPageContentStream content = new PDPageContentStream(doc,page,AppendMode.APPEND,true,true)){
          content.beginText();
          content.setFont(font, 12);
          serialNumberText.append(count);
          serialNumberText.append(" / ");
          serialNumberText.append(doc.getNumberOfPages());
          content.showText(serialNumberText.toString());
          count++;
          content.endText();
        }
      }
      font = null;
      doc.save(FILE_PATH);
    }catch(IOException ex) {
      ex.printStackTrace();
    }
  }
}

Main処理の解説

これはとくに解説するところもないですかね。privateメソッドのPDF新規作成と既存PDFをロードしてページ番号処理を呼び出しているだけです。

 
public class PdfInput {
  private static final String FONT_ARIALUNI = "C:/Windows/Fonts/ARIALUNI.TTF";
  private static final String FILE_PATH = "C:\\tmp\\oregairu.pdf";
  public static void main(String[] args) {
     
    PdfInput pdfInput = new PdfInput();
    //3ページのPDFを新規作成して保存
    pdfInput.pdfNewCreate();
     
    //新規作成したPDFを再度読み込んでページ番号を付与
    pdfInput.pdfLoadAndSerialNumber();
     
  }

pdfNewCreate()処理の解説

この処理は、既存PDFを作る処理ですね。

33行目は、各ページに出力する文字列なのでなんでもいいです。今回は、今はまっているアニメのヒロインの名前を出力してみました!

    List<String> pdfText = Arrays.asList("雪ノ下雪乃","由比ヶ浜結衣","一色いろは");

pdfLoadAndSerialNumber()処理の解説

今回のやりたい処理ですね。ここで既存のPDFをロードして各ページにページ番号を付与していきます。

61行目で既存PDFをロードしています。

PDFont font = PDType0Font.load(doc, new File(FONT_ARIALUNI));

65行目で各ページを取得してfor文で各ページにページ番号を付与しています。

      for(PDPage page : doc.getPages()) {

72行目でPDF全体のページ数を取得しています。

          serialNumberText.append(doc.getNumberOfPages());

コメント

タイトルとURLをコピーしました