PDFファイルの操作
v2025.12
JPedalは、PDFファイルの簡単な操作、編集、作成を可能にするPdfManipulator
クラスを提供します。
final PdfManipulator pdf = new PdfManipulator();
ドキュメントはFileまたはbyte[]から読み込むことができます。
pdf.loadDocument(new File("inputFile.pdf"));
pdf.loadDocument(pdfBytes);
パスワード保護されたドキュメントも読み込むことができます。
pdf.loadDocument(new File("inputFile.pdf"), "password".getBytes());
pdf.loadDocument(pdfBytes, "password".getBytes());
単一の空白ページを持つ新しいドキュメントを作成します。初期ページの寸法を指定する必要があります。一般的なサイズについてはPaperSize Javadoc を参照してください。
pdf.newDocument(PaperSize.A4_LANDSCAPE);
ドキュメントはFileまたはbyte[]に書き込むことができます。
pdf.writeDocument(new File("outputFile.pdf"));
final byte[] pdfBytes = pdf.writeDocument();
リソースを解放するために、終了後はドキュメントを閉じる必要があります。
pdf.closeDocument();
操作はPdfManipulatorが保持するキューに追加されます。追加された順序で適用されます。操作はapply()が呼び出された後もキューに残ります。
pdf.apply();
PdfManipulatorは操作のキューを保持するため、各操作をやり直すことなく、同じ編集を多くのドキュメントに適用できます。ただし、新しい編集を始めるためにキューをクリアしたい場合は、reset()を使用できます。
pdf.reset();
指定されたインデックスに1ページまたは複数のページをドキュメントに挿入します。ページインデックスは1から始まります。初期ページの寸法を指定する必要があります。一般的なサイズについてはPaperSize Javadoc を参照してください。
pdf.addPage(1, PaperSize.A4_LANDSCAPE);
pdf.addPage(new PageRanges("1-10"), PaperSize.LEGAL_PORTRAIT);
ページをコピーし、新しいコピーをドキュメント内の任意の場所に配置します。ページインデックスは1から始まります。
pdf.copyPage(1, 2);
ドキュメントから1ページまたは複数のページを削除します。ページインデックスは1から始まります。
pdf.removePage(1);
pdf.removePage(new PageRanges("1-10"));
1ページまたは複数のページのサイズを変更します。ページインデックスは1から始まります。係数でスケールするか、ターゲット寸法にスケールすることができます。ScaleMode Javadoc を参照してください。
pdf.scalePage(1, 0.5f, 0.5f);
pdf.scalePage(new PageRanges("1-10"), 2.0f, 1.0f);
pdf.scalePage(new PageRanges("1,3,4"), 400, 500, ScaleMode.SCALE_TO_DIMENSION);
1ページまたは複数のページのコンテンツのサイズを変更し、ページ寸法は同じままにします。ページインデックスは1から始まります。スケールされたページコンテンツを移動するために平行移動値を指定できます。PDFの原点は左下なので、10, 10の平行移動はコンテンツを左下隅から10単位離れた位置に移動します。ページ中央や右側などのプリセット平行移動についてはScalePageContent Javadoc を参照してください。
pdf.scalePageContent(1, 0.5f, 0.5f, 0.0f, 0.0f);
pdf.scalePageContent(new PageRanges("1-10"), 0.5f, 0.5f, ScalePageContent.RIGHT);
1ページまたは複数のページをクロップします。ページインデックスは1から始まります。係数でスケールするか、ターゲット寸法にスケールすることができます。ScaleMode Javadoc を参照してください。ページのクロップ方法を決定するアンカーを指定できます。Anchor Javadoc を参照してください。
pdf.cropPage(1, 0.5f, 0.5f);
pdf.cropPage(new PageRanges("1-10"), 2.0f, 1.0f);
pdf.cropPage(new PageRanges("1,3,4"), 400, 500, ScaleMode.SCALE_TO_DIMENSION);
pdf.cropPage(1, 0.5f, 0.5f, ScaleMode.SCALE_BY_FACTOR, Anchor.CENTER);
1ページまたは複数のページを回転します。ページインデックスは1から始まります。角度は度数で指定し、90の倍数である必要があります。現在の回転に基づいてページを回転させるか、ページの回転を特定の角度に設定できます。
pdf.rotatePage(1, -90);
pdf.setPageRotation(1, 180);
1ページまたは複数のページにテキストを追加します。ページインデックスは1から始まります。PDF基本フォントの1つを使用する必要があります。これらの値についてはBaseFont Javadoc を参照してください。
pdf.addText(1, "Hello World", 10, 10, BaseFont.HelveticaBold, 12, 1, 0.3f, 0.2f);
1ページまたは複数のページに画像を追加します。ページインデックスは1から始まります。BufferedImageを読み込めるライブラリが必要です。JDeli
を推奨します。画像の原点と寸法を定義する矩形を指定する必要があります。
final BufferedImage img = new BufferedImage();
pdf.addImage(1, img, new float[] {0, 0, 100, 100});
1ページまたは複数のページに図形を追加します。ページインデックスは1から始まります。Shape
を実装する任意の図形を指定できます。出力を制御するためにDrawParameters
のインスタンスを提供する必要があります。デフォルトの描画モードでは出力が生成されないため、少なくともsetFillRule(int)を使用して塗りルールを設定する必要があります。
final Shape shape = new Rectangle2D.Float(56.7f, 596.64f, 131.53f, 139.25f);
final DrawParameters params = new DrawParameters();
params.setStrokeColor(new float[] {1, 0, 0});
params.setFillRule(DrawParameters.STROKE);
pdf.addShape(1, shape, params);
1ページまたは複数のページに注釈を追加します。ページインデックスは1から始まります。以下の注釈タイプがサポートされています:
- Text
- Link
- FreeText
- Line
- Square
- Circle
- Polygon
- PolyLine
- Highlight
- Underline
- Squiggly
- StrikeOut
- Caret
- Stamp
- Ink
- FileAttachment - ファイルを添付する を参照してください
詳細についてはAnnotation Javadoc を参照してください。
final Annotation[] annotations = new Annotation[2];
// サイズ12のTimesNewRomanフォント、赤色、中央揃えのテキストボックス注釈
annotations[0] = new FreeText(new float[] {400, 600, 500, 700}, "hello!", new float[] {1.0f, 0.0f, 0.0f}, BaseFont.TimesRoman, 12, Quadding.CENTRED);
// 青色のハイパーリンク注釈
annotations[1] = new Link(new float[] {200, 600, 300, 700}, new float[] {0.0f, 0.0f, 1.0f}, "https://idrsolutions.com/");
pdf.addAnnotation(1, annotations);
PDFコンテンツストリームの知識がある場合は、XObjectを使用してカスタムAPストリームを設定することもできます。
詳細についてはXObject Javadoc を参照してください。
final Annotation annotation = new Annotation();
final XObject x = new XObject();
x.draw("q\n 0 0 1 rg\n 0 0 1 RG\n 1 1 199 199 re\n B\n Q\n");
annotation.setNormalAppearance(x);
annotation.setRolloverAppearance(x);
annotation.setDownAppearance(x);
任意のファイルをPDFドキュメントに埋め込みます。
pdf.embedFile(new File("embed.png"), "embedded-image");
任意のファイルをPDFドキュメントに埋め込み、1ページまたは複数のページにFileAttachment注釈を追加します。ページインデックスは1から始まります。注釈の原点と寸法を定義する矩形を指定する必要があります。注釈の色を指定する必要があります。色はグレー、RGB、またはCMYK(1、3、または4成分)を使用できます。
pdf.attachFile(1, new File("embed.png"), "embedded-image",
new float[] {10.0f, 10.0f, 100.0f, 100.0f}, new float[] {0.7f, 0.3f, 0.4f});
ドキュメント内のページを分離します(他のすべてのページを削除)。ページインデックスは1から始まります。
pdf.isolatePage(new PageRanges("1-2"));
ページのサブセットを単一ページまたは複数ページのグリッド配置に配置します。ページインデックスは1から始まります。デフォルトでは、結果のグリッドページにスケーリングは適用されず、その寸法は含まれるページの合計になります。印刷用途では、グリッドページの寸法を含まれるページと同じサイズに戻すために、スケーリング値を適用することを推奨します。たとえば、2x2グリッドでは、元の寸法を保持するために0.5のスケーリング係数が必要です。
// ページ1-10を2x2グリッドに配置し、必要な数のページを使用します
pdf.nUp(new PageRanges(1, 10), 2, 2);
// ページ1-10を2x2グリッドに配置し、必要な数のページを使用し、スケーリング係数を0.5にします
pdf.nUp(new PageRanges(1, 10), 2, 2, 0.5f);
ドキュメントに任意に複雑なブックマークを追加します。ブックマークの挿入はまだサポートされていないため、このメソッドを呼び出すとドキュメントから既存のブックマークが削除されます。各ブックマークはページにリンクする必要があります。ページインデックスは1から始まります。
詳細についてはBookmarks Javadoc を参照してください。
final Bookmarks root = new Bookmarks();
final Bookmark b = root.addChild("1", 1)
.addChild("1.1", 2)
.addChild("1.1.1", 3);
b.addChild("1.1.1.a", 4);
b.addChild("1.1.1.b", 5);
b.addChild("1.1.1.c", 6);
Bookmark b2 = b.addChild("1.1.1.d", 7);
b2.addChild("1.1.1.d.A", 8);
b2.addChild("1.1.1.d.B", 9);
root.addChild("2", 11)
.addChild("2.1", 13);
pdf.addBookmarks(root);
ドキュメントから既存のすべてのブックマークを削除します。
pdf.removeBookmarks();
ドキュメントに次の情報を設定します:
- Title(タイトル)
- Author(作成者)
- Subject(件名)
- Keywords(キーワード)
- Creator(作成アプリケーション)
- Producer(PDF変換)
- CreationDate(作成日)
- ModDate(更新日)
詳細についてはDocumentInfo Javadoc を参照してください。
final DocumentInfo docInfo = pdf.getDocumentInfo();
docInfo.setTitle("My PDF");
docInfo.setCreationDate(Instant.now());
pdf.setDocumentInfo(docInfo);
PDF 2.0以降では、代わりにXMPメタデータストリームを使用することを推奨します。ドキュメントメタデータを設定する を参照してください。
ドキュメントにカスタムXMPメタデータを設定するか、DocumentInfoオブジェクトから作成します。
final DocumentInfo docInfo = pdf.getDocumentInfo();
docInfo.setTitle("My PDF");
docInfo.setCreationDate(Instant.now());
pdf.setDocumentMetadata(docInfo.toXMP());
メタデータを削除する を参照してください。
ドキュメントの初期表示を設定します。初期表示は、互換性のあるPDFビューアで最初に開かれたときにドキュメントがどのように表示されるかを記述します。初期ページ、ページレイアウト、その他のビューア設定を指定できます。ページインデックスは1から始まります。
詳細についてはSetInitialView Javadoc およびViewerPreferences Javadoc を参照してください。
ViewerPreferences vp = new ViewerPreferences();
vp.setDisplayDocTitle(false);
pdf.setInitialView(3, new Destination.Fit(), PageLayout.TWO_PAGE_LEFT, PageMode.USE_NONE, vp);
ドキュメントのブックマークから目次を生成し、指定されたページの前に挿入します。ページインデックスは1から始まります。目次ページの寸法を指定する必要があります。一般的なサイズについてはPaperSize Javadoc を参照してください。PDF基本フォントの1つを使用する必要があります。これらの値についてはBaseFont Javadoc を参照してください。
pdf.addTableOfContents(1, PaperSize.A4_PORTRAIT, BaseFont.Helvetica, 12, new float[] {0, 0, 0});
指定されたページのメディアボックスを取得します。ページインデックスは1から始まります。
final float[] mediabox = pdf.getPageMediaBox(1);
指定されたページのクロップボックスを取得します。ページインデックスは1から始まります。
final float[] cropbox = pdf.getPageCropBox(1);
ドキュメント内のページ数を取得します。
final int pages = pdf.getPageCount();
ドキュメントにJavaScript(ECMAScript)が含まれているかどうかを判定します。
final boolean javascript = pdf.containsJavaScript();
ドキュメントからJavaScript(ECMAScript)を削除します。ドキュメントにJavaScriptが含まれていない場合、このメソッドは何もせずに終了するため、最初にcontainsJavaScript()を呼び出す必要はありません。
pdf.removeJavaScript();
ドキュメントから埋め込み/添付ファイルを削除します。
pdf.removeEmbeddedFiles();
ドキュメントからリンクを削除します。
pdf.removeLinks();
次のドキュメント情報を削除します:
- Title(タイトル)
- Author(作成者)
- Subject(件名)
- Keywords(キーワード)
- Creator(作成アプリケーション)
- Producer(PDF変換)
- CreationDate(作成日)
- ModDate(更新日)
- Trapped(トラップ)
また、XMP/XMLメタデータストリームも削除します。
pdf.removeMetadata();
ドキュメントまたは特定のページから注釈を削除します。ページインデックスは1から始まります。
pdf.removeAnnotations();
pdf.removeAnnotations(new PageRanges("1-3,5"));
ドキュメントから初期表示を削除します。
pdf.removeInitialView();
