政府が公開する法律の改正案は縦書き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()