PDFlib

高度なPDFアプリケーションの開発を支援する定番プログラムライブラリー Supported by インフォテック株式会社

PDFlib サンプル集(クックブック)

本サンプルプログラムは、PDF 文書生成ライブラリーの実装である PDFlib の基本的な機能を実際のプログラムで紹介したものです。

本サイトでダウンロードした PDFlib は、一部機能の制限を除き、評価版として無償でお使いいただけます。

PDF の結合

複数の PDF 文書のページを結合し、1つのPDFファイルに出力するプログラムです。ただし、元の PDF文書に含まれる文書情報やしおりは取込むことはできません。

PDFlib 10 ではページ上のインタラクティブ要素の取り込みに対応したため、ページ上の注釈やリンク、フォームフィールドが出力側でも維持されます。

  1. 出力PDF文書を開きます。
  2. 既存PDF文書を開き、ページ数を取得します。
  3. 既存PDF文書の全てのページを、出力PDF文書のページ上に配置していきます。また、配置する際にしおりを追加します。

PDF の結合方法と注意点については、テクニカルトピックの PDF の結合方法でも解説していますので、ご覧ください。

必要な製品:PDFlib+PDI/PDFlib PPS


/*
 * PDFの結合:
 * 複数の PDF 文書のページを結合します。
 *
 * しおり等のインタラクティブ要素は失われます。
 *
 * 必要な製品 : PDFlib+PDI/PPS 9
 * 必要なデータ : PDF文書
 */
package com.pdflib.cookbook.pdflib.pdf_import;

import com.pdflib.pdflib;
import com.pdflib.PDFlibException;

public class starter_pdfmerge
{
    public static void main (String argv[])
    {
    /* 必要に応じてデータファイルがあるフォルダのパスを指定する */
        String searchpath = "../input";
        String outfile = "starter_pdfmerge.pdf";
        String title = "Starter PDF Merge";

        pdflib p = null;
        int exitcode = 0;
        String pdffiles[] =
        {
            "PDFlib-datasheet.pdf",
            "PLOP-datasheet.pdf",
            "pCOS-datasheet.pdf"
        };
        int i;

        try {
            p = new pdflib();

            p.set_option("searchpath={" + searchpath + "}");

            /* load_font() 等でエラーが起きた場合、-1を返す */
            p.set_option("errorpolicy=return");

            if (p.begin_document(outfile, "") == -1)
            throw new Exception("Error: " + p.get_errmsg());

            p.set_info("Creator", "PDFlib Cookbook");
            p.set_info("Title", title);

            for (i=0; i < pdffiles.length; i++)
            {
                int indoc, endpage, pageno, page;

                /* 既存PDF文書を開く */
                indoc = p.open_pdi_document(pdffiles[i], "");
                if (indoc == -1)
                {
                    System.err.println("Error: " + p.get_errmsg());
                    continue;
                }

                /* 既存PDF文書の、ぺージ数を取得する */
                endpage = (int) p.pcos_get_number(indoc, "length:pages");

                /* 既存PDF文書のページ分ループする */
                for (pageno = 1; pageno <= endpage; pageno++)
                {
                    /* 既存PDF文書のページを開く */
                    page = p.open_pdi_page(indoc, pageno, "");

                    if (page == -1)
                    {
                        System.err.println("Error: " + p.get_errmsg());
                        continue;
                    }
                    /* ページサイズは fit_pdi_page() で調整される */
                    p.begin_page_ext(0, 0, "width=a4.width height=a4.height");

                    /* ファイル名でしおりを作成する */
                    if (pageno == 1)
                        p.create_bookmark(pdffiles[i], "");

                    /* 既存PDFページを出力PDFページ上に配置し、サイズを調整する */
                    p.fit_pdi_page(page, 0, 0, "adjustpage");
                    p.close_pdi_page(page);

                    p.end_page_ext("");
                }
                p.close_pdi_document(indoc);
            }

            p.end_document("");

        } catch (PDFlibException e) {
            System.err.println("PDFlib exception occurred:");
            System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() +
                ": " + e.get_errmsg());
            exitcode = 1;
        } catch (Exception e) {
            System.err.println(e);
            exitcode = 1;
        } finally {
            if (p != null) {
                p.delete();
            }
            System.exit(exitcode);
        }
    }
}
(Dec 11, 2012 - Dec 6, 2021)