PDF文字列取得とExcel連携の自動化スクリプト

# PDF文字列取得ｓとExcel連携の自動化スクリプト

この記事では、Pythonを使用してPDFファイルからデータを抽出し、Excelファイルと連携するスクリプトを解説します。主に**PyPDF2**と**openpyxl**を活用してます。
このコードは、図面からの拾い作業時に図面記載の文字列からオプション項目をリストアップする目的で設計されています。
## スクリプト概要

このスクリプトは以下の流れで処理を行います：

1. PDFファイルの読み込み
2. 条件に基づくデータ抽出
3. Excelファイルへの書き込み



## 必要なライブラリ

以下のライブラリを使用しています。事前にインストールしてください。

```bash
pip install PyPDF2 openpyxl pandas
```

## コード解説

### 1. PDFファイルの準備

```python
import os
desktop = os.path.join(os.path.join(os.environ["userprofile"]), "desktop")
dir_path = os.getcwd()
dir_name = os.path.basename(os.path.dirname(__file__))

if os.path.isfile(desktop + "\\図面一式.pdf"):
    zumen_path = desktop + "\\図面一式.pdf"
else:
    zumen_path = dir_path + "\\図面一式.pdf"
```

デスクトップまたは現在のディレクトリに存在する`図面一式.pdf`を取得します[1][2]。

### 2. PDFのテキスト抽出

```python
from PyPDF2 import PdfFileReader

with open(zumen_path, "rb") as pdf_input:
    reader = PdfFileReader(pdf_input)
    pdf_page = reader.getNumPages()
    pdf_str_sub = "sample"
    for n in range(pdf_page):
        page = reader.getPage(n)
        pdf_str_temp = str(page.extractText())
        pdf_str_sub = pdf_str_sub + pdf_str_temp
    pdf_str = "".join(pdf_str_sub)
```

`PdfFileReader`を使用してPDFを開き、全ページのテキストを結合しています[1][3]。

### 3. 条件によるデータ抽出

```python
if "２F平面図" in pdf_str or "2F平面図" in pdf_str:
    xlsx_list = [[23016, 1]]
else:
    xlsx_list = []
```

テキスト内に特定の文字列が含まれているかを確認し、リストにデータを追加します。

### 4. オプション項目の抽出

```python
import re
xlsx_list_option = re.findall(r"\[(.*?)\]", pdf_str)
print(xlsx_list_option)
```

正規表現で`[ ]`に囲まれた文字列を抽出します[4]。

### 5. Excelファイルの操作

```python
import openpyxl as px

wb = px.load_workbook("CSVtoEXP.xlsm", read_only=False, keep_vba=True, data_only=True)
sheet = wb['Serch']

for n in range(len(xlsx_list_option)):
    sheet.cell(min_row + n, column=6).value = "オプション工事"
    sheet.cell(min_row + n, column=7).value = 1
    sheet.cell(min_row + n, column=9).value = xlsx_list_option[n]
```

OpenPyXLを使用してExcelファイルを操作しています[2][5]。

### 6. データのコピー

```python
import pandas as pd

original_wb = pd.read_excel("CSVtoEXP original.xlsm", sheet_name="original", engine="openpyxl", header=None)
original_data = original_wb.values
dest_sheet = wb['original']

for row_idx, row in enumerate(original_data, start=1):
    for col_idx, value in enumerate(row, start=1):
        dest_sheet.cell(row=row_idx, column=col_idx).value = value
```

Pandasを使用して元データをコピーし、別のシートに記録します[5]。

### 7. 保存

```python
wb.save(dir_path + "\\CSVtoEXP.xlsm")
```

最終的に処理結果を保存します。

## 使用例

スクリプトを実行する前に、以下を準備してください：

- `図面一式.pdf`を指定のフォルダに配置。
- テンプレートファイル`CSVtoEXP.xlsm`。

実行すると、Excelファイルに抽出したデータが記録されます。

## 注意点

- `PdfFileReader`の`extractText`は抽出精度に限界があるため、PDFの構造によっては別のライブラリを検討してください[1][3]。
- Excel操作の際、テンプレートファイルのパスが正しいか確認してください[2][5]。

この記事が役に立った場合は「LGTM」をお願いします！ 😊

Citations:
[1] https://reffect.co.jp/python/python-pdf-table
[2] https://qiita.com/iceblue/items/d41b9b451bc696207c5a
[3] https://qiita.com/alice37308108/items/c9859a66981956e1dad1
[4] https://hayatasu.com/python-automation-example/
[5] https://docs.aspose.com/pdf/ja/python-net/convert-pdf-to-excel/
[6] https://magazine.techacademy.jp/magazine/28694
[7] https://note.com/elemag/n/nd2d4b5adc8a5
[8] https://note.com/python_lab/n/nfe934bb639e0