PDFファイルから画像を抜き出す

PDFビューワでは読みにくい時に

国立国会図書館デジタルコレクションに収録されている昭和の本を音読して、その録音の文字起こしからテキストデータを作成する試み。最初に困るのがダウンロードしたPDFが読みにくいことです。

読みにくいと言ってもこの場合は、難しい漢字や言い回しということではなくて、「画像が暗い」「字が小さい」など視覚的につらくて読みにくいということです。

それで、PDFからオリジナルのJPEGを抜き出す方法を調べてみました。

国立デジタル本の各ページは見開き2ページで1コマ、かなり大きいサイズのJPEG画像のようです。この画像が取れれば、画像編集プログラムで明るくしたりクロップしたりできるわけです。

PyPDF2とImageMagickで出来ました。

import subprocess
import PyPDF2

RESIZE = " -resize 1600x "
SIZE = "660x820"
Y = "+210"
CROPAREA1 = "+800" + Y
CROPAREA2 = "+140" + Y

# PDFからJPEGファイルを抜き出す
def ExtractJPEG(PdfFile):
    pdf = PyPDF2.PdfFileReader(PdfFile)
    All = pdf.pages
    SeqNo = 1
    for Page in All:
        xObject = Page['/Resources']['/XObject'].getObject()
        ImgFile = pdfDir + "img" + str(SeqNo).zfill(4) + ".jpg"
        for obj in xObject:
            if xObject[obj]['/Subtype'] == '/Image':
                if xObject[obj]['/Filter'] == '/DCTDecode':
                    with open(ImgFile, "wb") as img:
                        img.write(xObject[obj]._data)
        # 縮小・切抜き・コントラスト
        cmd = "convert " + ImgFile + RESIZE + pdfDir + "temp.jpg"
        subprocess.run(cmd, shell=True)

        SlideFile1 = pdfDir + "slide" + str(SeqNo).zfill(4) + "a.jpg"
        SlideFile2 = pdfDir + "slide" + str(SeqNo).zfill(4) + "b.jpg"
        cmd = "convert " +pdfDir + "temp.jpg" + " -contrast -contrast -contrast -crop " + SIZE + CROPAREA1 + " " + SlideFile1
        subprocess.run(cmd, shell=True)
        cmd = "convert " +pdfDir + "temp.jpg" + " -contrast -contrast -contrast -crop " + SIZE + CROPAREA2 + " " + SlideFile2
        subprocess.run(cmd, shell=True)

PDFから抜き出した画像:2339x1687ピクセルを縮小表示。

<img style=“width:100%; border:1px solid;“src="/asset/2020/10-17/img0006.jpg”>

抜き出した画像の片側:幅を1600にリサイズ、コントラスト3回、左半分を切抜き。

画像が得られたので、これを、クリックしたら次のページが表示されるようなスライドショーにすれば音読に便利そうです。


関連記事