えっ！そんなこともできるの？PDFから文字だけを抽出してみた

## 請求書対応って本当に大変!

皆さんは毎月の請求書対応にどれくらいの時間がかかりますか？
私の部署はひと月の稼働日数を20日(1日8時間勤務)とした場合、およそ **3日間(24時間)** は請求書対応をしています。
(請求書到着→自社システム入力→印刷→押印→関係部署同士で確認→の繰り返し～)

もう嫌だと思っても毎月発生するルーティンワークなので無くすことはできません。
それでもやっぱり~~面倒くさい~~時間がもったいない！

なんとか楽ができないかと支払システムをポチポチ触っていると、、、ありました。
CSV形式でのデータ読み込みシステム！！

でも請求書はPDFデータか紙で送付されるから、CSVファイルを直接作成するのは難しいなぁ
**・・・じゃあExcel に必要なデータを抽出して、CSVファイルを作ったらいいんじゃない！？**
ついでにExcelで届いた請求書を一覧化して進捗確認ができれば業務管理もできて一石二鳥♪
ということで、まずはPDFファイルから文字を抽出してみました。

https://twitter.com/amk193611/status/1688528723627462656


## 使用ツール
- Power Automate Desktop
- PDF
>Power Automate Desktopってなんだ？という方は[こちらの記事](https://smbiz.asahi.com/article/14634406)を参考にしてください。


## 作成したフロー
Power Automate Desktopを使って実際に作成したフローがこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/459e57fb-c831-d1da-74cc-89b3a4e38893.png)

PDFはダミーの請求書を作成しました。
今回はテキストのみを抽出してエクセルに転記します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/fe310d69-837d-4bae-8e3c-3b0ddb78f9e3.png)

フローの実行結果です。
行ごとにPDFのデータが抽出され転記されています。
今回は28行の読み取りでしたが、PDFファイルが変われば読み取り行数も変化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/47778ca6-008a-ef77-7539-6d76e8f49066.png)

## 作ってみよう
### 1.事前準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/a00aaaec-a59b-edc2-ee87-874b4a573cc5.png)
Power Automate Desktopを起動させ、フローの作成を始めるとこちらの画面に遷移します。
行いたいアクションを左の枠から探し、中央の枠へドラッグすることでフローを構築します。



### 2.PDFからテキストを抽出
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/1d7df61b-14aa-15f8-c19b-362a5d9d160b.png)
PDFからテキストを抽出するために対象となるPDFを指定します。

:::note info
ここで作成された変数`ExtractedPDFText`をメモしておくと便利です！
:::

### 3.テキストの分割
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/60c08934-830a-d21e-b36f-3ca611684166.png)
対象となるPDFのテキストデータを行ごとに分割します。

:::note info
**[こちら](https://gakushikiweblog.com/power-automate-desktop-text)** のサイトを参考にしました。
:::

### 4.変数の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/ee8c66af-e054-2bff-2ee0-cbd1cb2a24ad.png)
この後の手順で同じ処理を繰り返す"Loop"を行いますが、その事前準備として変数を設定します。
「テキストの分割」で作成された変数`TextList`に`.count`を加えます。

:::note info
ここで作成された変数`NewVar`をメモしておくと便利です！
**[こちら](https://gakushikiweblog.com/power-automate-desktop-variable)** のサイトを参考にしました。
:::

### 5.Excelの起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/8a973425-05af-4f49-a129-c494aa7653ea.png)
データの出力をするために新規エクセルを開きます。


### 6.Loop
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/2b2b666e-54d4-e66a-225b-8d3a0ad529b2.png)
先ほど作成した変数`NewVar`を終了値として入力します。
PDFの内容によって取得されるデータ数に違いがあるため、変数を用いて終了値を指定します。


### 7.Excelのワークシートに書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/f50b0fc7-d5a9-f05d-2910-bb60f49fc6db.png)

PDFから取得したデータをExcelに転記します。


### 8.Excelを閉じる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482672/70a7924c-9abd-2d53-4bf9-2121e71362ea.png)
作成したExcelデータを保存するドキュメント形式と保存場所を指定します。

### 9.フローのソースコード（Robin）
```ruby:PAD Robin
Pdf.ExtractTextFromPDF.ExtractText PDFFile: $'''C:\\Users\\lordo\\OneDrive\\デスクトップ\\3回目\\A社御中_社宅請求書_請求書_INV-0000000001.pdf''' DetectLayout: False ExtractedText=> ExtractedPDFText
Text.SplitText.Split Text: ExtractedPDFText StandardDelimiter: Text.StandardDelimiter.NewLine DelimiterTimes: 1 Result=> TextList
SET NewVar TO TextList.count
Excel.LaunchExcel.LaunchUnderExistingProcess Visible: True Instance=> ExcelInstance
LOOP LoopIndex FROM 1 TO NewVar STEP 1
    Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: TextList[LoopIndex - 1] Column: 1 Row: LoopIndex
    Excel.CloseExcel.CloseAndSaveAs Instance: ExcelInstance DocumentFormat: Excel.ExcelFormat.OpenXmlWorkbook DocumentPath: $'''C:\\Users\\lordo\\OneDrive\\デスクトップ\\3回目\\読み取り請求書_保管場所\\test7.xlsx'''

```




## 作ったフローを見てもらった＆まとめ

実際に作成したフローと結果を同僚に確認してもらいました。
本当は請求書の支払システムに投稿するCSVファイルまで作成したかったのですが、まずはPower Automate Desktop というツールの説明と今後の完成イメージを加えて説明し、ついでにもっとこうなってほしいなという理想もヒアリングしました。

「PDFからExcelに転記できることを知らなかった」「何が起きてるかわからんが機械が動いているのが見えて面白い」というツールに対する意見が最も多かったです。

特に毎月最も請求書の処理に追われている同僚Bさんからは
「請求書の対応という日常過ぎる業務が一部分でも機械化できるということに驚き」とコメントをいただきました。

また上司Aさんからは「テキストデータのすべてを抽出するのではなく、CSV化に必要な個所だけ抜き出してコピペができるシートになると汎用性が高い」「上手くいけば他部署の方にも共有したい」とコメントがありました。

上司Aさんの指摘通り、今回のフローは「PDFデータを文字に変換しただけ」です。
しかし同僚に確認してもらったことで、必要な機能を再確認・再定義できたことがよかったです。
実際にCSVファイル作成に至るまでには追加しなければならない手順が山ほどあると思いますので、修正を加えて実装までこぎつけたいと思います。