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());
コメント