
PDF文書のページを上下・左右に分割ページを上下または左右に分割します。
『PDF Tool API』では、表示矩形(ViewBox)と呼ぶMediaBoxとCropBox の交差した矩形を表すパラメータがあります。
MediaBoxとCropBoxが異なる範囲であるとき、MediaBoxとCropBoxの重なる矩形が表示・印刷領域となります。このようなとき、ViewBoxを用いることで、ビューワ上で表示される範囲を簡易に取得・設定することができます。
本サンプルプログラムでは
再設定ではViewBoxを用いることでMediaBox、CropBoxが表示矩形の値に設定されます。本プログラムではBleedBox、Trim、ArtBoxは削除されます。
package cookbook;
import jp.co.antenna.ptl.*;
public class DividePage {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
if (args.length < 3)
{
System.out.println("usage: java DividePage in-pdf-file out-pdf-file 分割方向");
System.out.println("分割方向\n0 : ページを上下に分割 1 : ページを左右に分割");
return;
}
String direction = args[2];
switch (direction) {
case "0":
case "1":
break;
default:
System.err.println("分割方向を正しく指定してください。");
System.err.println("usage: java DividePage in-pdf-file out-pdf-file 分割方向");
System.err.println("分割方向\n0 : ページを上下に分割 1 : ページを左右に分割");
return;
}
try (PtlParamInput inputFile = new PtlParamInput(args[0]);
PtlParamOutput outputFile = new PtlParamOutput(args[1]);
PtlPDFDocument doc = new PtlPDFDocument();
PtlPDFDocument docNew = new PtlPDFDocument();
PtlPages pagesNew = docNew.getPages())
{
// PDFファイルをロードします。
doc.load(inputFile);
// ページ数の取得
int numPages = doc.getPageCount();
System.out.println("ページ数:" + numPages);
...【RemovePages.javaと同じ処理のため省略
・doc.getPages()メソッドを用いてPtlPages pagesにページコンテナを取得
・ページコンテナが空だった場合にエラーを出力して終了】...
for (int i = 0; i < numPages; i++)
{
// 読み込んだページの取得
try (PtlPage page = pages.get(i);
PtlSize size = page.getSize();
PtlRect viewBox = page.getViewBox()) // 読み込んだページの表示矩形取得
{
float width = size.getWidth();
float height = size.getHeight();
// ページを分割していくので注釈のLinkアクションを削除しておく
removeLinkAction(page);
// 読み込んだページを新規PDFに2ページ分追加
pagesNew.append(page, PtlPages.OPTION_NONE);
pagesNew.append(page, PtlPages.OPTION_NONE);
int numPagesNew = pagesNew.getCount();
try (PtlPage pageNew1 = pagesNew.get(numPagesNew - 2); // 追加されたページを取得
PtlPage pageNew2 = pagesNew.get(numPagesNew - 1); // 追加されたページを取得
PtlRect rect1 = new PtlRect(viewBox); // 追加されたページに設定する表示矩形
PtlRect rect2 = new PtlRect(viewBox)) // 追加されたページに設定する表示矩形
{
switch (direction)
{
case "0":
{
// 半分の高さ
float halfHeight = size.getHeight() / 2;
// 矩形の上半分
rect1.setBottom(viewBox.getBottom() + halfHeight);
// 矩形の下半分
rect2.setTop(viewBox.getTop() - halfHeight);
}
break;
case "1":
{
// 半分の幅
float halfWidth = size.getWidth() / 2;
// 矩形の左半分
rect1.setRight(viewBox.getRight() - halfWidth);
// 矩形の右半分
rect2.setLeft(viewBox.getLeft() + halfWidth);
}
break;
}
// 追加されたページの表示矩形を設定
pageNew1.setViewBox(rect1);
pageNew2.setViewBox(rect2);
}
}
}
}
// ファイルに保存します。
docNew.save(outputFile);
}
...【GatPageCount.javaと同じ処理のため省略
・PtlException, Exception, Error を catchするエラー処理
・finally文で"--完了--"と表示する処理】...
}
public static void removeLinkAction(PtlPage page) throws PtlException, Exception, Error
{
if (!page.hasAnnots()) {
return;
}
try (PtlAnnots annots = page.getAnnots())
{
int numAnnots = annots.getCount();
for(int i=0; i<numAnnots; ++i) {
try (PtlAnnot annot = annots.get(i))
{
switch (annot.getType()) {
case TYPE_LINK:
{
PtlAnnotLink annotLink = (PtlAnnotLink)annot;
try (PtlAction action = annotLink.getAction())
{
switch (action.getType()) {
case TYPE_GOTO:
annotLink.removeAction();
break;
default:
break;
}
}
}
break;
default:
break;
}
}
}
}
}
}
DividePage.java
C:\samples>java cookbook.DividePage usage: java DividePage in-pdf-file out-pdf-file 分割方向 分割方向 0 : ページを上下に分割 1 : ページを左右に分割 C:\samples>java cookbook.DividePage test-edited.pdf test-edited-vdivide.pdf 1 ページ数:1 -- 完了 --
分割結果は図のようになります。この分割処理ではPDF文書のページを複製して各ページのPDFの境界値を設定し直しています。このため新しいPDF文書のファイルサイズは倍になります点にご注意下さい。
