Index > PDF文書を分割する(iText)
Fri, April 20, 2007

PDF文書を分割する(iText)

複数のPDFを一つのファイルに結合するとは逆に 複数ページからなるPDF文書を1ページごと別々のファイルに分割保存する方法。

例によって、 iTextのお世話になります。

※ここでは、 iTextを簡単に使うために、jythonを使用します。

※こちらの エントリ(jythonを楽にインストールするにはUbuntu) も参考にしてください。

コード split.py

import sys
import java.lang as lang
import java.io as io
import com.lowagie.text as itext
import com.lowagie.text.pdf as pdf



infile=sys.argv[1]


def createPdf(pagenumber,infile,outfile):

    fin=io.FileInputStream(infile)
    fout=io.FileOutputStream(outfile)

    r=pdf.PdfReader(fin)

    doc=itext.Document(r.getPageSizeWithRotation(1))
    w=pdf.PdfWriter.getInstance(doc,fout)

    doc.open()
    cb1 = w.getDirectContent()
    doc.setPageSize(r.getPageSizeWithRotation(pagenumber))
    doc.newPage()
    page=w.getImportedPage(r,pagenumber)

    rotation=r.getPageRotation(pagenumber)
    if rotation == 90 or rotation == 270 :
        cb1.addTemplate(
            page, 0, -1, 1, 0, 0, 
            r.getPageSizeWithRotation(pagenumber).height()
        )
    else :
        cb1.addTemplate(page, 1, 0, 0, 1, 0, 0)

    doc.close();
    r.close()

    fin.close()
    fout.close()



def getNumberOfPages(infile):
    fin=io.FileInputStream(infile)
    r=pdf.PdfReader(fin)

    n=r.getNumberOfPages()

    r.close()
    fin.close()

    return n




basefilename=lang.String(infile).replaceAll(".pdf$","")

n=getNumberOfPages(infile)
for i in range(n):
    pagenumber=i+1
    outfile=basefilename+"-"+str(pagenumber)+".pdf"

    createPdf(pagenumber,infile,outfile)

実行方法

  1. 上記コードを split.py というファイル名に保存します。
  2. 実行に必要なiText-2.1.3.jar ライブラリを iTextのサイト からダウンロードしておきます。
  3. 分割したいPDFファイルを用意しておきます。 (ここでは、test.pdf とします。)

これら全部をカレントディレクトリに配置したら、以下のようにして実行。

$ export CLASSPATH=iText-2.1.3.jar; jython split.py test.pdf

結果は、test-1.pdf,test-2.pdf,test-3.pdf ... に作成されます。

実行環境

Java 1.4.2 で作動テストしています。

関連エントリ

PDF文書をiTextを使って処理する...

 Twitter
follow me on Twitter
 Categories