Pdfデータよりエクセルへ転記する方法について

activities

#1

PDFから読み取り、エクセルに書き込む方法について質問させて頂きます。
RPA化したいものとしまして、数ページあるPDFから項目ごとに金額を読み取り、エクセルに転記するというものです。

(1) 注意点としまして、Find Element + Get Text とする前に、Attach windowにてPDFを指定する。
Anchor baseにて、Anchor positionをleftにする。ここまではわかるのですが、Find elementで指 定したデータの左隣は取得できるのですが、いくつかデータを挟んでしまうと、違うデータを取 得してしまいます。selector等の設定で解決する方法がございましたら、ご教授下さい。

(2) もう一つの方法として、Read Pdf text ⇒write cell にてA1セルに集約したうえで、send hotkey で検索する。ただ、数値が多く入っているPDFだと、検索するたびに、その値を検索しなければいけないので、RPA化するという観点においては適していないと思います。

こういった事例の際に便利なactivityや、適切な設定方法がございましたら、ご教授下さい。


Pdf自動化
#2

361oosugi様

Anchor baseを使わずに取得できるはずです。
この例をご覧ください:ExtractFromPDFToExcel.zip (375.1 KB)

UiExplorerで日付要素を検討すると、以下のようなツリーが出てきます:


まず、「日付」のrowを選択し、その要素の下はcellが二つありますが、取得したいtextは2つ目のcellの下にありますので、Selectorに<ctrl role='cell' idx='2'/>を追加します。

なお、PDFによる構造によりますが、このようにツリー構造を使ったら、他の要素(例えば、会社名や請求書番号など)も取得することができます。


#3

Hi @Mateus_Cruz , would you mind posting in English, to understand the post.


#4

Sure!

The initial challenge is that the element having, for example, the date of the invoice doesn’t offer enough information to construct a reliable selector: <ctrl name='2018年5月6日 ' role='text' />. Since the date of the invoice varies, it’s not a very good idea to use it in the selector (by the way, this is similar to what happens in the RPA Automation Challenge).

The sample I posted shows one way to get values from the invoice PDF (in this case, CompanyName, InvoiceDate and InvoiceNumber) without using the Anchor Base activity.

The main idea is to explore the visual tree that represents the PDF structure (left panel of the UiExplorer window):
-First, we can select the row having rowName='日付' (‘日付’ is a label that means ‘Date’). Since this label probably won’t change for invoices of the same type, it’s a good choice of attribute to include in the selector.
-Also from the visual tree we can see that row has two children (both called cell), but the text we’re looking for is always under the second child. That’s why we use idx='2' to arrive to that text.

The tree structure might vary with the PDF, but it’s possible to use the same idea to obtain other information from the invoice.


#5

ご教授頂きありがとうございます。

申し訳ございません。私の使用しているパソコンの仕様上、
請求書のpdfはダウンロード出来るのですが、Mainのuipathのwindows mark up file形式のファイルがダウンロードできないという問題があります。

恐れ入りますが、Uipath上にDropしたActivity一覧の画像を上記UiExplorer画像のように、見せて頂けないでしょうか?


#6

@361oosugi

Activity一覧は以下のスクリーンショット通りです:


まず、請求書のデータを保存するために、Build data tableアクティビティでData tableを定義します。
そのあと、Get Textアクティビティを利用し、会社名・日付・番号を取得します。
最後に、取得したデータをAdd data rowアクティビティでData tableに追加し、Excel Application ScopeのWrite rangeでExcelファイルに書きます。


#7

早速ご教授頂きありがとうございます。

上記のとおり試してみます。


#8

@Mateus_Cruz

教えていただいた通りにやってみましたが、
まだまだ勉強不足のため、
各ActivityにおけるPropertiesがいまいち分かりません。
以下の通りで間違った設定でしたら、ご教授ください。
① Build data table にて、Output で Ctrl + Kで Data Tableを宣言する。
② Get Text Activityにて会社名、日付、請求書番号ごとに変数を宣言する。
③ Add data row のData Table に、②で宣言した各変数を追加する。

もし可能であれば、正確な設定方法についてご教授頂ければ幸いです。


#9

@361oosugi

①はい、そうです。ただ、Build data tableアクティビティでDataTable…をクリックし、スキーマを定義します(この画面で列を削除や追加することができます):


②その通りですが、ポイントがSelectorです。以前ご説明したSelectorの取得方法をご参考ください。
③はい、そうです。インプットとして、ArrayRowプロパティに{CompanyName, InvoiceDate, InvoiceNumber}という形でArrayを定義します:

最後に、作ったData tableをWrite rangeアクティビティでExcelファイルに出力します。


#10

@Mateus_Cruz

おかげさまで、無事できました。
今回は、以下のように結果はなりましたが、

お忙しいところ恐れ入ります。
以下の場合の対応方法について、お分かりになりますでしょうか?

①今回、3列にして、やりましたが、1列に3つのデータをそのまま転記する場合、
build data tableはどのように編集するのでしょうか?

②項目ごと(例えば、国ごとに適合したものを取り出し、転記する)には、どのようなアクティビティが必要となってくるでしょうか?Uipath公式に問い合わせたところ、Matches もしくは Is matchesを使用すれば可能ということはわかるのですが、具体的な事例がございましたら、ご教授ください。Uipath guideには、それぞれのactivityの項目の詳細について記載はありますが、数値を多く含む表形式のPDFをVLOOKUPのように読み取ることはUipathでは可能でしょうか。


#11

追記
繰り返し作業に使うFor each等も活用した事例もあれば助かります。
また、attach window→get text →add data row→excel application scope→write range を
繰り返し使うと最初に読み取った行が2つ出てきてしまうのですが、Build data tableで設定するのでしょうか?
例) A という項目に対し、200という数値、 Bという項目に300という数字があったとして、
それを読み込んで、転記すると、Aが重なって出てきてしまう。
恐らく設定が間違っているため、上記のような事象が発生してしまうと考えられます。


#12

その場合は、Build data tableで1つの列を定義しますが、Add data rowを三回使います。

Matchesを使えずに、Data tableを作ったら、dt_Countries.Select("Country = 'Japan'")のように国=Japanの行を選択できます。そのあと、For eachアクティビティで使ったら選択した行の一覧が見えます:SelectExample.zip (8.6 KB)



#13

このサンプルをご参考ください:
SelectExample.zip (8.6 KB)
スクリーンショットは前のReplyに添付しました。

先ほど試しましたが、問題なく1つだけ出てきました。同じデータを2回取得していないかどうかご確認いただけらばと思います。


#14

@Mateus_Cruz

ご丁寧に教えて頂きありがとうございます。
エクセルへの書き込みに関しては、無事解決しました。

ただ、PDFにより、特定のページが読み取れなかったり、読み取れたり、
UIpath社の見解にもあるように、OCR機能にはあまり強くないそうです。
項目によって、selectorでちゃんと表示されたりされなかったり、課題は山積しているようです。

また、今回、重複した議題を投稿してしまい申し訳ございません。


#15

関連質問させて下さい。

EXCEL が PDFとしてメールで送られてくる。
行数30~31行
カラムは3つ 日付、開始時刻、終了時刻。
このFDFをデータテーブルとして読み込み、
EXCELデータにする(戻す)
適切な、読み込みアクティビティは何でしょうか。

よろしくおねがいします。
シルバー エンジニア 奥野智洋