PDFBoxを使って既存PDFにページ番号を付与してみた
PDFBoxというライブラリを使用して、既存PDFを読み込んでページ番号を付与してみたいと思います。
あまりappendモードで作成してる記事がないので参考になれば幸いです。
まずは準備、pom.xmlに依存関係を追加しましょう。
1 2 3 4 5 | <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version> 2.0 . 12 </version> </dependency> |
コード全体
今回は、初めに3ページのPDFを1つ「oregairu.pdf」という名前で作成します。
作成したのちに、作成したPDFをロードしてページ番号を連番でふっていく処理を行っています。
さっそく、以下がコード全体です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | 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をロードしてページ番号処理を呼び出しているだけです。
15 16 17 18 19 20 21 22 23 24 25 26 27 | 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行目は、各ページに出力する文字列なのでなんでもいいです。今回は、今はまっているアニメのヒロインの名前を出力してみました!
33 | List<String> pdfText = Arrays.asList( "雪ノ下雪乃" , "由比ヶ浜結衣" , "一色いろは" ); |
pdfLoadAndSerialNumber()処理の解説
今回のやりたい処理ですね。ここで既存のPDFをロードして各ページにページ番号を付与していきます。
61行目で既存PDFをロードしています。
61 | PDFont font = PDType0Font.load(doc, new File(FONT_ARIALUNI)); |
65行目で各ページを取得してfor文で各ページにページ番号を付与しています。
65 | for (PDPage page : doc.getPages()) { |
72行目でPDF全体のページ数を取得しています。
72 | serialNumberText.append(doc.getNumberOfPages()); |
コメント