#pip install pdfminer.six # 参考URL https://www.shibutan-bloomers.com/python_library_pdfminer-six/2124/ # 対応 預かり金と特定口座の国内現物株式と国内投信のみの保有対応  一般預かり、旧NISA預かり、信用口座、貸し株、外国株式不可 # 必要なPdfminer.sixモジュールのクラスをインポート from pdfminer.pdfinterp import PDFResourceManager from pdfminer.converter import TextConverter from pdfminer.pdfinterp import PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.layout import LAParams from io import StringIO import os import glob fp_csv= open("D:\\1\\pdfkabu2\\csv_sample1.csv", 'w', encoding='utf-8', newline='\n') dir_path = "D:\\1\\pdfkabu2" #このフォルダに、各取引残高報告書のpdfファイルを、yyyymmdd.pdfのファイル名で保存 file_list = glob.glob(os.path.join(dir_path, "*.pdf")) for pdf_path in file_list: # 標準組込み関数open()でモード指定をbinaryでFileオブジェクトを取得 fp = open(pdf_path, 'rb') # 出力先をPythonコンソールするためにIOストリームを取得の場合 #outfp = StringIO() #出力先をテキストファイルの場合 outfp = open(pdf_path+"_sample1.txt", 'w', encoding='utf-8') # 各種テキスト抽出に必要なPdfminer.sixのオブジェクトを取得する処理 rmgr = PDFResourceManager() # PDFResourceManagerオブジェクトの取得 lprms = LAParams() # LAParamsオブジェクトの取得 device = TextConverter(rmgr, outfp, laparams=lprms) # TextConverterオブジェクトの取得 iprtr = PDFPageInterpreter(rmgr, device) # PDFPageInterpreterオブジェクトの取得 # PDFファイルから1ページずつ解析(テキスト抽出)処理する for page in PDFPage.get_pages(fp): iprtr.process_page(page) #text = outfp.getvalue() # Pythonコンソールへの出力内容を取得 outfp.close() # ストリームを閉じる device.close() # TextConverterオブジェクトの解放 fp.close() # Fileストリームを閉じる #print(text) # Jupyterの出力ボックスに表示する fp= open(pdf_path+"_sample1.txt", 'r', encoding='utf-8') # for debug fp_csv_kobetu= open(pdf_path+"_.csv", 'w', encoding='utf-8') fp_csv.write(pdf_path[pdf_path.find("pdfkabu2\\")+9:pdf_path.find("pdfkabu2\\")+9+8]+",") azukarikin=0 syutoku_sougaku=0 kijunbi_sougaku=0 while(1): aa = fp.readline() if aa.find("【お預り金等の残高】 ")!=-1 : break fp.readline() aa = fp.readline() if aa.find("野村MRF")>-1 : aa=aa[20:] while(("  ").find(aa[0:1])==0): aa=aa[1:] aa=aa[0:aa.find("口")] while(aa.find(",")!=-1): aa=aa[0:aa.find(",")]+aa[aa.find(",")+1:] azukarikin=int(aa) aa = fp.readline() aa=aa[20:] while(("  ").find(aa[0:1])==0): aa=aa[1:] aa=aa[0:aa.find("円")] while(aa.find(",")!=-1): aa=aa[0:aa.find(",")]+aa[aa.find(",")+1:] azukarikin=azukarikin+int(aa) fp_csv.write(str(azukarikin)) # 0 の部分にハイブリッド預金の過去の残高記録を手入力する。 fp_csv.write(",0,") while(1): aa = fp.readline() if aa.find("【(ご参考)特定預り証券の取得コスト等】 ")!=-1 : break fp.readline() while(1): aa = fp.readline() if aa.find("取")!=-1 : fp.readline() fp.readline() aa=fp.readline() if aa.find("合  計")>1 : break if len(aa)<4 : aa = fp.readline() if aa.find("計")>0 : break while(1): aa = fp.readline() if aa.find("【(ご参考)特定預り証券の取得コスト等】 ")!=-1 : break fp.readline() continue if aa.find("国内株式等")==0 : waru =1 if aa.find("国内投資信託")==0: waru = 10000 if aa.find("国内")==0 : aa=aa[30:] # if ((pdf_path[pdf_path.find("pdfkabu2\\")+9:pdf_path.find("pdfkabu2\\")+9+8]).find("20150331")==0): # print(aa) aa=aa[aa.find(" "):] while(aa.find(",")!=-1): aa=aa[0:aa.find(",")]+aa[aa.find(",")+1:] if aa.find("株")>0 : kutikabusuu=int(aa[0:aa.find("株")]) aa=aa[aa.find("株")+1:] if aa.find("口")>0 : kutikabusuu=int(aa[0:aa.find("口")]) aa=aa[aa.find("口")+1:] while(("  ").find(aa[0:1])==0): aa=aa[1:] syutoku_tanka = int(aa[0:aa.find("円")]) aa=aa[aa.find("円")+1:] while(("  ").find(aa[0:1])==0): aa=aa[1:] kijunbi_tanka = float(aa[0:aa.find("円")]) aa=aa[aa.find("円")+1:] fp_csv_kobetu.write(str(syutoku_tanka * kutikabusuu / waru)+","+str(kijunbi_tanka * kutikabusuu /waru)+"\n") syutoku_sougaku = syutoku_sougaku + syutoku_tanka * kutikabusuu / waru kijunbi_sougaku = kijunbi_sougaku + kijunbi_tanka * kutikabusuu /waru fp.readline() print(pdf_path[pdf_path.find("pdfkabu2\\")+9:pdf_path.find("pdfkabu2\\")+9+8]) print("取得金額="+str(syutoku_sougaku)) print("取引残高報告書・発行日時価評価額="+str(kijunbi_sougaku)) print("") fp_csv.write(str(int(syutoku_sougaku))+","+str(int(kijunbi_sougaku))+"\n") fp.close() fp_csv_kobetu.close() # break fp_csv.close() #得られた、csv_sample1.csv にハイブリッド預金の過去の残高記録を手入力し、表計算ソフトに読み込んでグラフ描画。