6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pythonで法律の改正案(縦書きPDF)を整えてテキストファイルにする

Last updated at Posted at 2018-05-28

政府が公開する法律の改正案は縦書きPDFです。
モニターが小さいと読みにくいので横書きテキストファイルにします。

今回使わせていただくPDFファイルはこちらです。

gettext関数はこちらのサイトからほぼ丸パクリさせていただきました。

pdf2text.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
import re

pdfname = 'testpdf.pdf'

def gettext(pdfname):
    # PDFファイル名が未指定の場合は、空文字列を返して終了
    if (pdfname == ''):
        return ''
    else:
        # 処理するPDFファイルを開く/開けなければ
        try:
            fp = open(pdfname, 'rb')
        except:
            return ''
        
    # リソースマネージャインスタンス
    rsrcmgr = PDFResourceManager()
    # 出力先インスタンス
    outfp = StringIO()
    # パラメータインスタンス
    laparams = LAParams()
    # 縦書き文字を横並びで出力する
    laparams.detect_vertical = True
    # デバイスの初期化
    device = TextConverter(rsrcmgr, outfp, codec='utf-8', laparams=laparams)
    # テキスト抽出インタプリタインスタンス
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # 対象ページを読み、テキスト抽出する。(maxpages:0は全ページ)
    for page in PDFPage.get_pages(fp, pagenos=None, maxpages=0, password=None,\
            caching=True, check_extractable=True):
        interpreter.process_page(page)
    #取得したテキストをすべて読みだす
    ret = outfp.getvalue()
    # 後始末をしておく    
    fp.close()
    device.close()
    outfp.close()

    return ret

ret = gettext(pdfname)
file = open('testoutpdf.txt', 'w', encoding='utf-8')
file.write(ret)
file.close()

file = open('testoutpdf.txt', 'r' ,encoding='utf-8')
lines = file.readlines()
file.close()

file = open('testoutpdf.txt', 'w', encoding='utf-8')

#一行ごとに開業があるのでそれを消す
text = []
for line in lines:
    
    line = re.sub(r'^\n$', '', line)
    text.append(line)

file.writelines(text)
file.close()

#ページ番号の正規表現
kan_num = re.compile(r'^([一二三四五六七八九十百千万]+)$\n')
page_num = re.compile(r'^([0-9]+)$\n')
zenkaku_num = re.compile(r'^([0-9]+)$\n')

#文先頭の数字の正規表現
kakko_num = re.compile(r'^[㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩]')
sentou_num = re.compile(r'^([0-9]+)')
sentou_zenkaku_num = re.compile(r'^([0-9]+)')


f_in = open('testoutpdf.txt', 'r', encoding='utf-8')
f_out = open('./testout.txt', 'w', encoding='utf-8')
lines = f_in.readlines()

text = []

for line in lines:
    #ページ番号はappendしない
    if re.search(kan_num, line):
        pass
    elif re.search(page_num, line):
        pass
    elif re.search(zenkaku_num, line):
        pass
    #先頭が括弧漢数字、数字、漢数字の場合先頭に開業を足す
    elif re.search(kakko_num, line):
        if '\n' in line:
            text.append('\n\n' + line)
        else:
            line = line.replace('\n', '')
            text.append('\n\n' + line)
    elif re.search(sentou_num, line):
        if '\n' in line:
            text.append('\n\n' + line)
        else:
            line = line.replace('\n', '')
            text.append('\n\n' + line)
    elif re.search(sentou_zenkaku_num, line):
        if '\n' in line:
            text.append('\n\n' + line)
        else:
            line = line.replace('\n', '')
            text.append('\n\n' + line)

    #丸で終わらない場合、改行を消して文をつなげる
    else:
        line = line.replace('\n', '')
        text.append(line)


f_out.writelines(text)

f_in.close()
f_out.close()
6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?