93060
PDFは全62ページとしました。  
このPDFに対して下記のような辞書を作成しました。中身は保存する名前とそのページ数です。

```

    pdf_dic = {
        'tokyocaffe':3,
        'yokohamabook':10,
        'saitamahouse':5,
        'tokyoshrine':19,
        'aichicoffee':7,
        'fukuokafood':9,
        'tokyobook':3,
        'kyotocaffe':2,
        'shigafood':3,
        'tokyogoods':1
    }
    
```

1-3ページはtokyocaffe.pdf、4-13ページはyokohamabook.pdfといったように順番にPDFを作成したいです。

PyPDF2を使用して１ページずつ分割することはできるのですが、辞書の内容を絡めて処理する方法がわからないです。  
わかる方いましたらご教授願います。
CC BY-SA 4.0
2022-12-28T02:24:07.403
93058
2022-12-28T06:33:10.503
2022-12-28T06:33:10.503
3060
56114
question
python pdf
PDFを指定したページごとに分割し、それぞれ指定した名前を付けて保存したい
[`PyPDF2.PdfMerger.append`](https://pypdf2.readthedocs.io/en/latest/modules/PdfMerger.html#pypdf.PdfMerger.append)の`pages`引数に(`開始位置`,
`終了位置+1`)のタプルを指定することで複数ページの分割ができます。(開始位置と終了位置は0始まりです)  
その仕組みと辞書型を組み合わせることで目的のコードを作成できます。

**サンプルコード**  
※単一のコードで完結して動作するよう、デジ庁のオープンデータのガイドライン(全7ページ)を[ダウンロード](https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/f7fde41d-ffca-4b2a-9b25-94b8a701a037/7c57e1a9/20220523_resources_data_guideline_01.pdf)します。(要`pip
install requests`)

```

    import pathlib
    
    # ファイルがない場合はオープンデータのガイドラインをダウンロードする
    file_name = "20220523_resources_data_guideline_01.pdf" 
    if not pathlib.Path(file_name).exists():
        import requests # 要 pip install requests
        url = "https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/f7fde41d-ffca-4b2a-9b25-94b8a701a037/7c57e1a9/20220523_resources_data_guideline_01.pdf" 
        res = requests.get(url)
        with open(file_name, "wb") as f:
            f.write(res.content)
    
    import PyPDF2
    
    pdf_dic = {
        'hoge':3,
        'fuga':2,
        'piyo':2,
    }
    
    start = 0 # 開始位置
    for key in pdf_dic:
        merger = PyPDF2.PdfMerger()
        end = start + pdf_dic[key] # 終了位置+1
        merger.append(file_name, pages=(start, end)) # 複数ページを抽出
        merger.write(f"{key}.pdf") # 保存
        start = end
    
```
CC BY-SA 4.0
2022-12-28T04:14:39.323
93060
2022-12-28T04:14:39.323
9820
93058
answer