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());
1つの空ページを持つ新しいドキュメントを作成します。初期ページの寸法を指定する必要があります。一般的なサイズについては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つまたは複数のページ上にグリッド形式で配置します。ページインデックスは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();
