Closed6

PythonでPDFを読み取る(PaddleOCR)

kun432kun432

以下でもちょっとPDF周りには触れたけど。

https://zenn.dev/kun432/scraps/3726d7f1d6e534

以下の記事に触発されて、いろいろPDF周りもあるねということでまずはPaddleOCRを試してみた。

https://gihyo.jp/article/2023/07/programming-with-chatgpt-04

https://qiita.com/sakasegawa/items/8abd902ac45a3cd2862c

Colaboratoryでやります。

サンプルとして、以下で公開されているJRAの過去の馬場情報(クッション値・含水率)についてのPDFを使ってみる。

https://www.jra.go.jp/keiba/baba/archive/

2023年の東京競馬第1回のもの使う。

!wget https://www.jra.go.jp/keiba/baba/archive/2023pdf/tokyo01.pdf

一応こんな感じの体裁になっていて、モザイクかけたところに小数点で数値が入っている。(モザイク書けたのは転載にならないように、だけどあんまり意味ないかも)

kun432kun432

PaddleOCR

https://github.com/PaddlePaddle/PaddleOCR

PaddleOCR aims to create multilingual, awesome, leading, and practical OCR tools that help users train better models and apply them into practice.

PaddleOCR support a variety of cutting-edge algorithms related to OCR, and developed industrial featured models/solution PP-OCR and PP-Structure on this basis, and get through the whole process of data production, model training, compression, inference and deployment.

インストール

https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_en/quickstart_en.md

とりあえずGPUなしで。カーネル再起動が必要。

!pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install "paddleocr>=2.0.1"

paddleOCRでPDFを直接読むにはPyMuPDF<=1.19が必要になる。入ってないとエラーになる→参考

!pip install "PyMuPDF<=1.19"

あと、Colaboratory環境では以下も必要になる→参考

!wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.19_amd64.deb
!sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.19_amd64.deb

まずはコマンドラインから試してみる。

!paddleocr --image_dir tokyo01.pdf --lang japan --use_gpu false

初回だけモデルのダウンロードが行われるのですこし時間がかかる。結果はこんな感じで出力される。

[2023/08/06 03:55:44] ppocr DEBUG: Namespace(help='==SUPPRESS==', use_gpu=False, use_xpu=False, use_npu=False, ir_optim=True, use_tensorrt=False, min_subgraph_size=15, precision='fp32', gpu_mem=500, gpu_id=0, image_dir='tokyo01.pdf', page_num=0, det_algorithm='DB', det_model_dir='/root/.paddleocr/whl/det/ml/Multilingual_PP-OCRv3_det_infer', det_limit_side_len=960, det_limit_type='max', det_box_type='quad', det_db_thresh=0.3, det_db_box_thresh=0.6, det_db_unclip_ratio=1.5, max_batch_size=10, use_dilation=False, det_db_score_mode='fast', det_east_score_thresh=0.8, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, det_sast_score_thresh=0.5, det_sast_nms_thresh=0.2, det_pse_thresh=0, det_pse_box_thresh=0.85, det_pse_min_area=16, det_pse_scale=1, scales=[8, 16, 32], alpha=1.0, beta=1.0, fourier_degree=5, rec_algorithm='SVTR_LCNet', rec_model_dir='/root/.paddleocr/whl/rec/japan/japan_PP-OCRv4_rec_infer', rec_image_inverse=True, rec_image_shape='3, 48, 320', rec_batch_num=6, max_text_length=25, rec_char_dict_path='/usr/local/lib/python3.10/dist-packages/paddleocr/ppocr/utils/dict/japan_dict.txt', use_space_char=True, vis_font_path='./doc/fonts/simfang.ttf', drop_score=0.5, e2e_algorithm='PGNet', e2e_model_dir=None, e2e_limit_side_len=768, e2e_limit_type='max', e2e_pgnet_score_thresh=0.5, e2e_char_dict_path='./ppocr/utils/ic15_dict.txt', e2e_pgnet_valid_set='totaltext', e2e_pgnet_mode='fast', use_angle_cls=False, cls_model_dir='/root/.paddleocr/whl/cls/ch_ppocr_mobile_v2.0_cls_infer', cls_image_shape='3, 48, 192', label_list=['0', '180'], cls_batch_num=6, cls_thresh=0.9, enable_mkldnn=False, cpu_threads=10, use_pdserving=False, warmup=False, sr_model_dir=None, sr_image_shape='3, 32, 128', sr_batch_num=1, draw_img_save_dir='./inference_results', save_crop_res=False, crop_res_save_dir='./output', use_mp=False, total_process_num=1, process_id=0, benchmark=False, save_log_path='./log_output/', show_log=True, use_onnx=False, output='./output', table_max_len=488, table_algorithm='TableAttn', table_model_dir=None, merge_no_span_structure=True, table_char_dict_path=None, layout_model_dir=None, layout_dict_path=None, layout_score_threshold=0.5, layout_nms_threshold=0.5, kie_algorithm='LayoutXLM', ser_model_dir=None, re_model_dir=None, use_visual_backbone=True, ser_dict_path='../train_data/XFUND/class_list_xfun.txt', ocr_order_method=None, mode='structure', image_orientation=False, layout=True, table=True, ocr=True, recovery=False, use_pdf2docx_api=False, lang='japan', det=True, rec=True, type='ocr', ocr_version='PP-OCRv4', structure_version='PP-StructureV2')
[2023/08/06 03:55:45] ppocr INFO: **********tokyo01.pdf**********
Deprecation: 'getPixmap' removed from class 'Page' after v1.19.0 - use 'get_pixmap'.
[2023/08/06 03:55:46] ppocr DEBUG: dt_boxes num : 124, elapse : 1.0878705978393555
[2023/08/06 03:56:05] ppocr DEBUG: rec_res num  : 124, elapse : 18.62787675857544
[2023/08/06 03:56:05] ppocr INFO: [[[272.0, 124.0], [355.0, 124.0], [355.0, 151.0], [272.0, 151.0]], ('2023年', 0.9997745752334595)]
[2023/08/06 03:56:05] ppocr INFO: [[[362.0, 123.0], [547.0, 123.0], [547.0, 153.0], [362.0, 153.0]], ('第1回東京競馬', 0.9999629259109497)]
[2023/08/06 03:56:05] ppocr INFO: [[[562.0, 123.0], [801.0, 121.0], [801.0, 151.0], [563.0, 153.0]], ('含水率-クッション値', 0.8889427185058594)]
[2023/08/06 03:56:05] ppocr INFO: [[[81.0, 188.0], [206.0, 188.0], [206.0, 209.0], [81.0, 209.0]], ('第1日:第2日', 0.8921121954917908)]
[2023/08/06 03:56:05] ppocr INFO: [[[214.0, 189.0], [296.0, 189.0], [296.0, 206.0], [214.0, 206.0]], ('_2023年1', 0.981441855430603)]
[2023/08/06 03:56:05] ppocr INFO: [[[295.0, 188.0], [434.0, 188.0], [434.0, 209.0], [295.0, 209.0]], ('月27日~29日', 0.9654073715209961)]
[2023/08/06 03:56:05] ppocr INFO: [[[558.0, 212.0], [624.0, 212.0], [624.0, 233.0], [558.0, 233.0]], ('金曜日', 0.9998521208763123)]
[2023/08/06 03:56:05] ppocr INFO: [[[677.0, 212.0], [738.0, 212.0], [738.0, 233.0], [677.0, 233.0]], ('土曜日', 0.9994471669197083)]
[2023/08/06 03:56:05] ppocr INFO: [[[795.0, 212.0], [854.0, 212.0], [854.0, 233.0], [795.0, 233.0]], ('日曜日', 0.9977384209632874)]
[2023/08/06 03:56:05] ppocr INFO: [[[212.0, 237.0], [396.0, 237.0], [396.0, 257.0], [212.0, 257.0]], ('芝コースクッション値', 0.9299570918083191)]
[2023/08/06 03:56:05] ppocr INFO: [[[617.0, 239.0], [646.0, 239.0], [646.0, 257.0], [617.0, 257.0]], ('9.1', 0.9072422385215759)]
(snip)
[2023/08/06 03:56:05] ppocr INFO: [[[156.0, 1171.0], [335.0, 1172.0], [335.0, 1195.0], [156.0, 1193.0]], ('ダートコース含水率', 0.9838936924934387)]
[2023/08/06 03:56:05] ppocr INFO: [[[430.0, 1172.0], [512.0, 1175.0], [511.0, 1195.0], [429.0, 1192.0]], ('ゴール前', 0.992638111114502)]
[2023/08/06 03:56:05] ppocr INFO: [[[611.0, 1174.0], [646.0, 1174.0], [646.0, 1198.0], [611.0, 1198.0]], ('10.3', 0.997323751449585)]
[2023/08/06 03:56:05] ppocr INFO: [[[188.0, 1196.0], [306.0, 1196.0], [306.0, 1222.0], [188.0, 1222.0]], ('(パーセント)', 0.9904041290283203)]
[2023/08/06 03:56:05] ppocr INFO: [[[426.0, 1201.0], [486.0, 1201.0], [486.0, 1218.0], [426.0, 1218.0]], ('4コー-', 0.9128594398498535)]
[2023/08/06 03:56:05] ppocr INFO: [[[619.0, 1199.0], [646.0, 1199.0], [646.0, 1219.0], [619.0, 1219.0]], ('93', 0.9996424913406372)]
[2023/08/06 03:56:05] ppocr INFO: [[[738.0, 1202.0], [760.0, 1202.0], [760.0, 1215.0], [738.0, 1215.0]], ('」9', 0.7762061357498169)]
[2023/08/06 03:56:05] ppocr INFO: [[[853.0, 1201.0], [879.0, 1201.0], [879.0, 1218.0], [853.0, 1218.0]], ('7.6', 0.8650274872779846)]

一応できてるっぽい。

kun432kun432

ではPythonで。

from paddleocr import PaddleOCR, draw_ocr

ocr = PaddleOCR(lang="japan")
img_path = './tokyo01.pdf'
result = ocr.ocr(img_path)
for idx in range(len(result)):
    res = result[idx]
    for line in res:
        print(line)
[2023/08/06 04:01:48] ppocr DEBUG: Namespace(help='==SUPPRESS==', use_gpu=False, use_xpu=False, use_npu=False, ir_optim=True, use_tensorrt=False, min_subgraph_size=15, precision='fp32', gpu_mem=500, gpu_id=0, image_dir=None, page_num=0, det_algorithm='DB', det_model_dir='/root/.paddleocr/whl/det/ml/Multilingual_PP-OCRv3_det_infer', det_limit_side_len=960, det_limit_type='max', det_box_type='quad', det_db_thresh=0.3, det_db_box_thresh=0.6, det_db_unclip_ratio=1.5, max_batch_size=10, use_dilation=False, det_db_score_mode='fast', det_east_score_thresh=0.8, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, det_sast_score_thresh=0.5, det_sast_nms_thresh=0.2, det_pse_thresh=0, det_pse_box_thresh=0.85, det_pse_min_area=16, det_pse_scale=1, scales=[8, 16, 32], alpha=1.0, beta=1.0, fourier_degree=5, rec_algorithm='SVTR_LCNet', rec_model_dir='/root/.paddleocr/whl/rec/japan/japan_PP-OCRv4_rec_infer', rec_image_inverse=True, rec_image_shape='3, 48, 320', rec_batch_num=6, max_text_length=25, rec_char_dict_path='/usr/local/lib/python3.10/dist-packages/paddleocr/ppocr/utils/dict/japan_dict.txt', use_space_char=True, vis_font_path='./doc/fonts/simfang.ttf', drop_score=0.5, e2e_algorithm='PGNet', e2e_model_dir=None, e2e_limit_side_len=768, e2e_limit_type='max', e2e_pgnet_score_thresh=0.5, e2e_char_dict_path='./ppocr/utils/ic15_dict.txt', e2e_pgnet_valid_set='totaltext', e2e_pgnet_mode='fast', use_angle_cls=False, cls_model_dir='/root/.paddleocr/whl/cls/ch_ppocr_mobile_v2.0_cls_infer', cls_image_shape='3, 48, 192', label_list=['0', '180'], cls_batch_num=6, cls_thresh=0.9, enable_mkldnn=False, cpu_threads=10, use_pdserving=False, warmup=False, sr_model_dir=None, sr_image_shape='3, 32, 128', sr_batch_num=1, draw_img_save_dir='./inference_results', save_crop_res=False, crop_res_save_dir='./output', use_mp=False, total_process_num=1, process_id=0, benchmark=False, save_log_path='./log_output/', show_log=True, use_onnx=False, output='./output', table_max_len=488, table_algorithm='TableAttn', table_model_dir=None, merge_no_span_structure=True, table_char_dict_path=None, layout_model_dir=None, layout_dict_path=None, layout_score_threshold=0.5, layout_nms_threshold=0.5, kie_algorithm='LayoutXLM', ser_model_dir=None, re_model_dir=None, use_visual_backbone=True, ser_dict_path='../train_data/XFUND/class_list_xfun.txt', ocr_order_method=None, mode='structure', image_orientation=False, layout=True, table=True, ocr=True, recovery=False, use_pdf2docx_api=False, lang='japan', det=True, rec=True, type='ocr', ocr_version='PP-OCRv4', structure_version='PP-StructureV2')
[2023/08/06 04:01:48] ppocr WARNING: Since the angle classifier is not initialized, the angle classifier will not be uesd during the forward process
Deprecation: 'getPixmap' removed from class 'Page' after v1.19.0 - use 'get_pixmap'.
[2023/08/06 04:01:49] ppocr DEBUG: dt_boxes num : 124, elapse : 1.1132023334503174
[2023/08/06 04:02:09] ppocr DEBUG: rec_res num  : 124, elapse : 19.55954909324646
[[[272.0, 124.0], [355.0, 124.0], [355.0, 151.0], [272.0, 151.0]], ('2023年', 0.9997745752334595)]
[[[362.0, 123.0], [547.0, 123.0], [547.0, 153.0], [362.0, 153.0]], ('第1回東京競馬', 0.9999629259109497)]
[[[562.0, 123.0], [801.0, 121.0], [801.0, 151.0], [563.0, 153.0]], ('含水率-クッション値', 0.8889427185058594)]
[[[81.0, 188.0], [206.0, 188.0], [206.0, 209.0], [81.0, 209.0]], ('第1日:第2日', 0.8921121954917908)]
[[[214.0, 189.0], [296.0, 189.0], [296.0, 206.0], [214.0, 206.0]], ('_2023年1', 0.981441855430603)]
[[[295.0, 188.0], [434.0, 188.0], [434.0, 209.0], [295.0, 209.0]], ('月27日~29日', 0.9654073715209961)]
[[[558.0, 212.0], [624.0, 212.0], [624.0, 233.0], [558.0, 233.0]], ('金曜日', 0.9998521208763123)]
[[[677.0, 212.0], [738.0, 212.0], [738.0, 233.0], [677.0, 233.0]], ('土曜日', 0.9994471669197083)]
[[[795.0, 212.0], [854.0, 212.0], [854.0, 233.0], [795.0, 233.0]], ('日曜日', 0.9977384209632874)]
[[[212.0, 237.0], [396.0, 237.0], [396.0, 257.0], [212.0, 257.0]], ('芝コースクッション値', 0.9299570918083191)]
[[[617.0, 239.0], [646.0, 239.0], [646.0, 257.0], [617.0, 257.0]], ('9.1', 0.9072422385215759)]
[[[735.0, 239.0], [763.0, 239.0], [763.0, 256.0], [735.0, 256.0]], ('9.3', 0.880970299243927)]
[[[851.0, 239.0], [877.0, 239.0], [877.0, 256.0], [851.0, 256.0]], ('93', 0.9988899230957031)]
[[[449.0, 287.0], [497.0, 287.0], [497.0, 309.0], [449.0, 309.0]], ('場所', 0.9998040199279785)]
[[[558.0, 287.0], [619.0, 287.0], [619.0, 309.0], [558.0, 309.0]], ('金曜日', 0.9984533786773682)]
[[[796.0, 287.0], [853.0, 287.0], [853.0, 309.0], [796.0, 309.0]], ('日曜日', 0.9980331063270569)]
[[[176.0, 312.0], [316.0, 312.0], [316.0, 331.0], [176.0, 331.0]], ('芝コース含水率', 0.9977294206619263)]
[[[434.0, 315.0], [512.0, 315.0], [512.0, 330.0], [434.0, 330.0]], ('ゴール前', 0.9773667454719543)]
[[[611.0, 313.0], [642.0, 313.0], [642.0, 331.0], [611.0, 331.0]], ('13.1', 0.9812991619110107)]
[[[729.0, 315.0], [761.0, 315.0], [761.0, 331.0], [729.0, 331.0]], ('2.5', 0.9089696407318115)]
[[[844.0, 313.0], [876.0, 313.0], [876.0, 330.0], [844.0, 330.0]], ('14.0', 0.9777465462684631)]
[[[186.0, 336.0], [307.0, 336.0], [307.0, 355.0], [186.0, 355.0]], ('「ーセント)', 0.8939412236213684)]
[[[428.0, 337.0], [506.0, 337.0], [506.0, 352.0], [428.0, 352.0]], ('4コーナ-', 0.9392881393432617)]
[[[613.0, 337.0], [645.0, 337.0], [645.0, 355.0], [613.0, 355.0]], ('4.3', 0.939932107925415)]
[[[729.0, 337.0], [761.0, 337.0], [761.0, 354.0], [729.0, 354.0]], ('3.5', 0.9253433346748352)]
[[[844.0, 337.0], [874.0, 337.0], [874.0, 354.0], [844.0, 354.0]], ('138', 0.9985335469245911)]
[[[156.0, 357.0], [335.0, 359.0], [335.0, 380.0], [156.0, 378.0]], ('ダートコース含水率', 0.9814940690994263)]
[[[430.0, 357.0], [514.0, 360.0], [513.0, 381.0], [429.0, 378.0]], ('ゴール前', 0.9996424913406372)]
[[[615.0, 361.0], [642.0, 356.0], [646.0, 376.0], [618.0, 380.0]], ('3.1', 0.8571781516075134)]
[[[735.0, 361.0], [761.0, 361.0], [761.0, 380.0], [735.0, 380.0]], ('2.6', 0.9921268820762634)]
[[[851.0, 361.0], [876.0, 361.0], [876.0, 380.0], [851.0, 380.0]], ('1.8', 0.9263256192207336)]
[[[191.0, 386.0], [303.0, 386.0], [303.0, 402.0], [191.0, 402.0]], ('はパーセント1', 0.7360350489616394)]
[[[429.0, 387.0], [459.0, 391.0], [457.0, 403.0], [427.0, 399.0]], ('4コ', 0.878449022769928)]
[[[617.0, 386.0], [645.0, 386.0], [645.0, 402.0], [617.0, 402.0]], ('39', 0.9976867437362671)]
[[[853.0, 387.0], [876.0, 387.0], [876.0, 402.0], [853.0, 402.0]], ('23', 0.999901533126831)]
[[[83.0, 458.0], [414.0, 458.0], [414.0, 479.0], [83.0, 479.0]], ('第3日-第4日 (2023年2月3日〜5日)', 0.9605187773704529)]
[[[559.0, 482.0], [622.0, 482.0], [622.0, 504.0], [559.0, 504.0]], ('金曜日', 0.9992064833641052)]
[[[677.0, 479.0], [739.0, 485.0], [737.0, 506.0], [675.0, 500.0]], ('土曜日', 0.9992668628692627)]
[[[795.0, 482.0], [857.0, 482.0], [857.0, 504.0], [795.0, 504.0]], ('日曜日', 0.961710512638092)]
[[[860.0, 490.0], [868.0, 490.0], [868.0, 498.0], [860.0, 498.0]], ('-', 0.9825798273086548)]
[[[212.0, 508.0], [396.0, 508.0], [396.0, 528.0], [212.0, 528.0]], ('芝コースクッシヨン値', 0.913601279258728)]
[[[735.0, 511.0], [763.0, 511.0], [763.0, 528.0], [735.0, 528.0]], ('9.3', 0.905133068561554)]
[[[848.0, 510.0], [879.0, 510.0], [879.0, 528.0], [848.0, 528.0]], ('93', 0.9520367383956909)]
[[[451.0, 561.0], [497.0, 561.0], [497.0, 578.0], [451.0, 578.0]], ('場所', 0.9997944235801697)]
[[[562.0, 561.0], [608.0, 561.0], [608.0, 578.0], [562.0, 578.0]], ('金曜', 0.9987136721611023)]
[[[805.0, 563.0], [839.0, 563.0], [839.0, 575.0], [805.0, 575.0]], ('曜', 0.9269399046897888)]
[[[837.0, 566.0], [851.0, 566.0], [851.0, 575.0], [837.0, 575.0]], ('-', 0.9963417649269104)]
[[[173.0, 579.0], [321.0, 579.0], [321.0, 605.0], [173.0, 605.0]], ('芝コース含水率', 0.9930540919303894)]
[[[433.0, 585.0], [513.0, 585.0], [513.0, 602.0], [433.0, 602.0]], ('ゴール前', 0.9999648332595825)]
[[[613.0, 585.0], [645.0, 585.0], [645.0, 607.0], [613.0, 607.0]], ('4.3', 0.959094226360321)]
[[[729.0, 585.0], [760.0, 585.0], [760.0, 603.0], [729.0, 603.0]], ('39', 0.9993070960044861)]
[[[845.0, 585.0], [874.0, 585.0], [874.0, 603.0], [845.0, 603.0]], ('3.1', 0.994850218296051)]
[[[182.0, 602.0], [309.0, 605.0], [308.0, 631.0], [182.0, 627.0]], ('(パーセント)', 0.9824856519699097)]
[[[428.0, 613.0], [497.0, 613.0], [497.0, 623.0], [428.0, 623.0]], ('4コーサ', 0.6520822644233704)]
[[[614.0, 608.0], [646.0, 608.0], [646.0, 629.0], [614.0, 629.0]], ('5.0', 0.9850645065307617)]
[[[727.0, 607.0], [763.0, 607.0], [763.0, 629.0], [727.0, 629.0]], ('14.5', 0.962462306022644)]
[[[845.0, 608.0], [876.0, 608.0], [876.0, 626.0], [845.0, 626.0]], ('3.9', 0.8406720161437988)]
[[[157.0, 631.0], [335.0, 631.0], [335.0, 652.0], [157.0, 652.0]], ('ダートコース含水率', 0.9995005130767822)]
[[[429.0, 627.0], [515.0, 631.0], [514.0, 654.0], [428.0, 650.0]], ('ゴール前', 0.9995600581169128)]
[[[616.0, 629.0], [646.0, 629.0], [646.0, 653.0], [616.0, 653.0]], ('20', 0.9999412298202515)]
[[[737.0, 634.0], [761.0, 634.0], [761.0, 652.0], [737.0, 652.0]], ('1.7', 0.9823305606842041)]
[[[850.0, 634.0], [876.0, 634.0], [876.0, 650.0], [850.0, 650.0]], ('1.6', 0.954416811466217)]
[[[191.0, 658.0], [301.0, 658.0], [301.0, 675.0], [191.0, 675.0]], ('パーセント', 0.9892259836196899)]
[[[738.0, 659.0], [761.0, 659.0], [761.0, 672.0], [738.0, 672.0]], ('19', 0.8621453046798706)]
[[[851.0, 658.0], [877.0, 658.0], [877.0, 675.0], [851.0, 675.0]], ('1.8', 0.8376657366752625)]
[[[81.0, 731.0], [215.0, 731.0], [215.0, 752.0], [81.0, 752.0]], ('第5日:第6日「', 0.9125267267227173)]
[[[209.0, 731.0], [433.0, 731.0], [433.0, 752.0], [209.0, 752.0]], ('(2023年2月10日〜12日', 0.9845688343048096)]
[[[559.0, 756.0], [620.0, 756.0], [620.0, 773.0], [559.0, 773.0]], ('金曜日', 0.8628713488578796)]
[[[686.0, 758.0], [737.0, 758.0], [737.0, 773.0], [686.0, 773.0]], ('二曜日', 0.9538586139678955)]
[[[795.0, 755.0], [856.0, 755.0], [856.0, 776.0], [795.0, 776.0]], ('日曜日', 0.9950170516967773)]
[[[214.0, 779.0], [396.0, 779.0], [396.0, 799.0], [214.0, 799.0]], ('芝コースクッション値', 0.9744805097579956)]
[[[618.0, 783.0], [642.0, 780.0], [644.0, 794.0], [620.0, 797.0]], ('9ク', 0.7893280982971191)]
[[[850.0, 780.0], [877.0, 780.0], [877.0, 797.0], [850.0, 797.0]], ('89', 0.9983647465705872)]
[[[452.0, 832.0], [492.0, 832.0], [492.0, 850.0], [452.0, 850.0]], ('場所', 0.9974502325057983)]
[[[176.0, 855.0], [316.0, 855.0], [316.0, 876.0], [176.0, 876.0]], ('芝コース含水率', 0.9982752203941345)]
[[[434.0, 858.0], [512.0, 858.0], [512.0, 874.0], [434.0, 874.0]], ('コール前', 0.9439657926559448)]
[[[613.0, 858.0], [642.0, 858.0], [642.0, 874.0], [613.0, 874.0]], ('5.1', 0.9863286018371582)]
[[[731.0, 859.0], [760.0, 859.0], [760.0, 871.0], [731.0, 871.0]], ('85', 0.9686971306800842)]
[[[845.0, 856.0], [874.0, 856.0], [874.0, 873.0], [845.0, 873.0]], ('4.2', 0.836097240447998)]
[[[185.0, 876.0], [307.0, 879.0], [307.0, 902.0], [185.0, 898.0]], ('[パーセント)', 0.9249606728553772)]
[[[427.0, 880.0], [498.0, 882.0], [498.0, 897.0], [426.0, 895.0]], ('4コーナ', 0.9946543574333191)]
[[[614.0, 880.0], [646.0, 880.0], [646.0, 901.0], [614.0, 901.0]], ('4.2', 0.8633613586425781)]
[[[731.0, 883.0], [760.0, 883.0], [760.0, 895.0], [731.0, 895.0]], ('9,6', 0.8877277970314026)]
[[[845.0, 880.0], [876.0, 880.0], [876.0, 898.0], [845.0, 898.0]], ('4.6', 0.9519050121307373)]
[[[155.0, 898.0], [335.0, 900.0], [335.0, 926.0], [154.0, 924.0]], ('ダートコース含水率', 0.921837568283081)]
[[[431.0, 903.0], [515.0, 903.0], [515.0, 924.0], [431.0, 924.0]], ('ゴール前', 0.9999768733978271)]
[[[619.0, 904.0], [645.0, 904.0], [645.0, 923.0], [619.0, 923.0]], ('2.5', 0.9811860918998718)]
[[[731.0, 908.0], [760.0, 908.0], [760.0, 920.0], [731.0, 920.0]], ('62', 0.914039134979248)]
[[[845.0, 904.0], [876.0, 904.0], [876.0, 923.0], [845.0, 923.0]], ('4.6', 0.9817325472831726)]
[[[187.0, 926.0], [304.0, 927.0], [304.0, 948.0], [186.0, 947.0]], ('[パーセント)', 0.9083181619644165)]
[[[619.0, 929.0], [646.0, 929.0], [646.0, 945.0], [619.0, 945.0]], ('23', 0.9998237490653992)]
[[[844.0, 929.0], [877.0, 929.0], [877.0, 945.0], [844.0, 945.0]], ('14,0', 0.9784121513366699)]
[[[83.0, 1001.0], [209.0, 1001.0], [209.0, 1022.0], [83.0, 1022.0]], ('第7日-第8日', 0.8858746886253357)]
[[[211.0, 1001.0], [431.0, 1001.0], [431.0, 1021.0], [211.0, 1021.0]], ('2023年2月17日〜19日', 0.9967237710952759)]
[[[559.0, 1025.0], [622.0, 1025.0], [622.0, 1047.0], [559.0, 1047.0]], ('金曜日', 0.9992937445640564)]
[[[677.0, 1025.0], [738.0, 1025.0], [738.0, 1047.0], [677.0, 1047.0]], ('土曜日', 0.9992005228996277)]
[[[795.0, 1025.0], [856.0, 1025.0], [856.0, 1047.0], [795.0, 1047.0]], ('日曜日', 0.9932393431663513)]
[[[220.0, 1053.0], [394.0, 1053.0], [394.0, 1068.0], [220.0, 1068.0]], ('ニコースクッション修', 0.8047517538070679)]
[[[617.0, 1053.0], [646.0, 1053.0], [646.0, 1071.0], [617.0, 1071.0]], ('9.0', 0.9785971641540527)]
[[[735.0, 1054.0], [758.0, 1054.0], [758.0, 1066.0], [735.0, 1066.0]], ('91', 0.9953039884567261)]
[[[848.0, 1053.0], [877.0, 1053.0], [877.0, 1069.0], [848.0, 1069.0]], ('93', 0.9968968629837036)]
[[[452.0, 1096.0], [496.0, 1101.0], [493.0, 1125.0], [448.0, 1120.0]], ('場所', 0.9997918605804443)]
[[[561.0, 1101.0], [622.0, 1101.0], [622.0, 1122.0], [561.0, 1122.0]], ('金曜日', 0.9994781017303467)]
[[[796.0, 1101.0], [854.0, 1101.0], [854.0, 1122.0], [796.0, 1122.0]], ('日曜日', 0.9986830353736877)]
[[[176.0, 1125.0], [316.0, 1125.0], [316.0, 1146.0], [176.0, 1146.0]], ('芝コース含水率', 0.9990925192832947)]
[[[430.0, 1123.0], [512.0, 1127.0], [511.0, 1150.0], [429.0, 1146.0]], ('ゴール前', 0.999570369720459)]
[[[610.0, 1127.0], [645.0, 1127.0], [645.0, 1150.0], [610.0, 1150.0]], ('15.3', 0.9611267447471619)]
[[[727.0, 1128.0], [761.0, 1128.0], [761.0, 1145.0], [727.0, 1145.0]], ('13.8', 0.9367430210113525)]
[[[845.0, 1127.0], [876.0, 1127.0], [876.0, 1145.0], [845.0, 1145.0]], ('4.3', 0.8306242823600769)]
[[[185.0, 1146.0], [303.0, 1150.0], [302.0, 1171.0], [185.0, 1167.0]], ('(パーセント)', 0.9264750480651855)]
[[[428.0, 1153.0], [486.0, 1153.0], [486.0, 1168.0], [428.0, 1168.0]], ('4コー-', 0.8534287810325623)]
[[[611.0, 1148.0], [646.0, 1148.0], [646.0, 1172.0], [611.0, 1172.0]], ('5.5', 0.9916481375694275)]
[[[729.0, 1153.0], [761.0, 1153.0], [761.0, 1169.0], [729.0, 1169.0]], ('39', 0.9773207306861877)]
[[[845.0, 1153.0], [876.0, 1153.0], [876.0, 1169.0], [845.0, 1169.0]], ('3.8', 0.8054296374320984)]
[[[156.0, 1171.0], [335.0, 1172.0], [335.0, 1195.0], [156.0, 1193.0]], ('ダートコース含水率', 0.9838936924934387)]
[[[430.0, 1172.0], [512.0, 1175.0], [511.0, 1195.0], [429.0, 1192.0]], ('ゴール前', 0.992638111114502)]
[[[611.0, 1174.0], [646.0, 1174.0], [646.0, 1198.0], [611.0, 1198.0]], ('10.3', 0.997323751449585)]
[[[188.0, 1196.0], [306.0, 1196.0], [306.0, 1222.0], [188.0, 1222.0]], ('(パーセント)', 0.9904041290283203)]
[[[426.0, 1201.0], [486.0, 1201.0], [486.0, 1218.0], [426.0, 1218.0]], ('4コー-', 0.9128594398498535)]
[[[619.0, 1199.0], [646.0, 1199.0], [646.0, 1219.0], [619.0, 1219.0]], ('93', 0.9996424913406372)]
[[[738.0, 1202.0], [760.0, 1202.0], [760.0, 1215.0], [738.0, 1215.0]], ('」9', 0.7762061357498169)]
[[[853.0, 1201.0], [879.0, 1201.0], [879.0, 1218.0], [853.0, 1218.0]], ('7.6', 0.8650274872779846)]

各行は、文字が存在する矩形領域の座標、読み取った文字列、信頼度になっているようなので、冒頭のgihyoさんの記事のように、右上の座標と文字列だけにするなら、以下で良い。

(snip)
    for line in res:
        print(f"({line[0][0][0]}, {line[0][0][1]}): {line[1][0]}")
(272.0, 124.0): 2023年
(362.0, 123.0): 第1回東京競馬
(562.0, 123.0): 含水率-クッション値
(81.0, 188.0): 第1日:第2日
(214.0, 189.0): _2023年1
(295.0, 188.0): 月27日~29日
(558.0, 212.0): 金曜日
(677.0, 212.0): 土曜日
(795.0, 212.0): 日曜日
(212.0, 237.0): 芝コースクッション値
(617.0, 239.0): 9.1
(735.0, 239.0): 9.3
(851.0, 239.0): 93
(449.0, 287.0): 場所
(558.0, 287.0): 金曜日
(796.0, 287.0): 日曜日
(176.0, 312.0): 芝コース含水率
(434.0, 315.0): ゴール前
(611.0, 313.0): 13.1
(729.0, 315.0): 2.5
(844.0, 313.0): 14.0
(186.0, 336.0): 「ーセント)
(428.0, 337.0): 4コーナ-
(613.0, 337.0): 4.3
(729.0, 337.0): 3.5
(844.0, 337.0): 138
(156.0, 357.0): ダートコース含水率
(430.0, 357.0): ゴール前
(615.0, 361.0): 3.1
(735.0, 361.0): 2.6
(851.0, 361.0): 1.8
(191.0, 386.0): はパーセント1
(429.0, 387.0): 4コ
(617.0, 386.0): 39
(853.0, 387.0): 23
(83.0, 458.0): 第3日-第4日 (2023年2月3日〜5日)
(559.0, 482.0): 金曜日
(677.0, 479.0): 土曜日
(795.0, 482.0): 日曜日
(860.0, 490.0): -
(212.0, 508.0): 芝コースクッシヨン値
(735.0, 511.0): 9.3
(848.0, 510.0): 93
(451.0, 561.0): 場所
(562.0, 561.0): 金曜
(805.0, 563.0): 曜
(837.0, 566.0): -
(173.0, 579.0): 芝コース含水率
(433.0, 585.0): ゴール前
(613.0, 585.0): 4.3
(729.0, 585.0): 39
(845.0, 585.0): 3.1
(182.0, 602.0): (パーセント)
(428.0, 613.0): 4コーサ
(614.0, 608.0): 5.0
(727.0, 607.0): 14.5
(845.0, 608.0): 3.9
(157.0, 631.0): ダートコース含水率
(429.0, 627.0): ゴール前
(616.0, 629.0): 20
(737.0, 634.0): 1.7
(850.0, 634.0): 1.6
(191.0, 658.0): パーセント
(738.0, 659.0): 19
(851.0, 658.0): 1.8
(81.0, 731.0): 第5日:第6日「
(209.0, 731.0): (2023年2月10日〜12日
(559.0, 756.0): 金曜日
(686.0, 758.0): 二曜日
(795.0, 755.0): 日曜日
(214.0, 779.0): 芝コースクッション値
(618.0, 783.0): 9ク
(850.0, 780.0): 89
(452.0, 832.0): 場所
(176.0, 855.0): 芝コース含水率
(434.0, 858.0): コール前
(613.0, 858.0): 5.1
(731.0, 859.0): 85
(845.0, 856.0): 4.2
(185.0, 876.0): [パーセント)
(427.0, 880.0): 4コーナ
(614.0, 880.0): 4.2
(731.0, 883.0): 9,6
(845.0, 880.0): 4.6
(155.0, 898.0): ダートコース含水率
(431.0, 903.0): ゴール前
(619.0, 904.0): 2.5
(731.0, 908.0): 62
(845.0, 904.0): 4.6
(187.0, 926.0): [パーセント)
(619.0, 929.0): 23
(844.0, 929.0): 14,0
(83.0, 1001.0): 第7日-第8日
(211.0, 1001.0): 2023年2月17日〜19日
(559.0, 1025.0): 金曜日
(677.0, 1025.0): 土曜日
(795.0, 1025.0): 日曜日
(220.0, 1053.0): ニコースクッション修
(617.0, 1053.0): 9.0
(735.0, 1054.0): 91
(848.0, 1053.0): 93
(452.0, 1096.0): 場所
(561.0, 1101.0): 金曜日
(796.0, 1101.0): 日曜日
(176.0, 1125.0): 芝コース含水率
(430.0, 1123.0): ゴール前
(610.0, 1127.0): 15.3
(727.0, 1128.0): 13.8
(845.0, 1127.0): 4.3
(185.0, 1146.0): (パーセント)
(428.0, 1153.0): 4コー-
(611.0, 1148.0): 5.5
(729.0, 1153.0): 39
(845.0, 1153.0): 3.8
(156.0, 1171.0): ダートコース含水率
(430.0, 1172.0): ゴール前
(611.0, 1174.0): 10.3
(188.0, 1196.0): (パーセント)
(426.0, 1201.0): 4コー-
(619.0, 1199.0): 93
(738.0, 1202.0): 」9
(853.0, 1201.0): 7.6

こうやって見ると結構失敗してる気もする。

kun432kun432

PaddleOCRは画像をOCRすることもできる。その場合はgihyoさんの記事のように、PDFを一旦画像化してからOCRにかける。PDFを画像に変換するにはpdf2imageを使う。

!pip install pdf2image

pdf2imageではpoppler-utilsに依存しているのであわせてインストールする。

!apt-get update
!apt-get install -y poppler-utils

あとはgihyoさんの記事のようにすればOK。

精度的にはPDFを直接読んだ場合とさして変わらない。

fine-tuningすれば精度が上がるかもしれない。

kun432kun432

ちなみにpdf2imageにはCLIもあるけど、pdf2image-cliという別パッケージになっている。

このスクラップは2023/08/06にクローズされました