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

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

今回使わせていただくPDFファイルは[こちら](http://www.soumu.go.jp/main_content/000536608.pdf)です。

gettext関数は[こちらのサイト](http://arakan-pgm-ai.hatenablog.com/entry/2018/01/07/080000)からほぼ丸パクリさせていただきました。

```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'^([０-９]+)$\n')

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


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()
```