複数ページあるPDFのDatascrapingについて

activities

#1

①複数ページあるPDFを一つのsheetにDatascrapingで落とすことは可能でしょうか?
write rangeですと、セルを指定すればできますが、ページによってデータの行数が異なる場合、上書きされてしまったりすることがあります。

②write range で書き込むと、セルが「折り返して全体を表示する」という設定になってしまいます。Defaultの設定でしょうが、設定を変更することは可能でしょうか。


#2

① 最終的に書き出すためのDataTableを別に用意しておいて、ページごとにExtract Dataで出力されたDataTableを、そこに「Marge Data Table」で結合していき、全部のページの処理が終わってからExcelに纏めて書き出すのがシンプルだと思います。
書式等があわないようであれば、Extract Dataしたデータの行数を変数に記録しておき、それに合わせて書き出し先のRangeのアドレスを調節する感じでしょうか。
DataTableの行数は、
DataTable型の変数.Rows.Count
で取得できます。また、Rangeのアドレスであれば、
String.Format(“A{0}”, 行番号)
みたいな設定がわかりやすいかと思います(A列の場合)

②いくつか方法は考えられますが、
・貼り付けるためのテンプレートになるExcelブックを用意して、書式を設定しておく(Excelブックをロードしたら別名で保存する)

・Excelに対してセルの書式設定を行う操作を自動化する
(「セルの書式設定」のダイアログを出して、「配置」タブ内を操作させる)

でしょうか。


#3

@Honoka

ありがとうございます。

①に関しまして、書式は同じなので、問題はありません。
Destinationには、追加元のExtraDataTableを。
Sourceには追加するExtraDataTable2を。
Missingなんとかには、addとして、書き込む際のSourceは、
ExtraDataTableにするといった感じでしょうか。

やってみたのですが、ExtraDataTable2しか書き込まれませんでした。
修正すべき点をご教授いただければ幸いです。


#4

やり方はあっている、と思うのですが・・・、

出力されているDataTableのフィールドに、データテーブルが入れ子になっていると上手くいかないことがある(その場合、レコード事にMergeする必要がある)、ぐらいしか思いつきません。

あとは(Write LineなりLog Messageなりで)Mergeする前の各DataTableのレコード数と、Mergeした後のレコード数を出力してみてください。
「レコード数がきちんとマージされてない」のか「マージされてる(加算されてる)けどExcelへの書き出しに失敗しているのか」の切り分けができるので・・・。
(DataTable型の変数.Rows.Countで行数が取得できます。文字列で出すなら.ToString()すれば大丈夫です)


#5

@Honoka様
お忙しいところ、ご教授頂きありがとうございました。
お陰様で、データを順次加えることが出来ました。
2つ目のDataScrapingを一つ目のDatascrapingの枠(?)に入れましたら、
解決致しました。すみません。


#6

@Honoka様
上記の質問は解決致しましたが、関連して質問させて下さい。
現状、一ページごとにdatasraping、sendhotkey、remove datarowとしていく方法しか思いつかないのですが、この方法ですと、例えば40ページぐらいあるPDFですと、ページごとに指定しなければならず、真の効率化とは程遠いと思っております。
なので、For each等を使用して、ループ処理を行いたいのですが、
方法はご存知でしょうか。


#7

処理のフローを見ていないのでやや一般論寄りになりますが、ページ数があらかじめわかっているなら、
・Int32型の変数を用意して、初期値に1を設定する
・While(またはDo While)の条件に、繰り返し回数未満であること設定する
(たとえば10回繰り返すなら、変数名 < 10 )としておく、等
・While内のループでAssignを使用して、変数の値に1つず加算していく(変数名 = 変数名 + 1)
みたいなループを組んで、その中で1ページごとに処理する、みたいな感じになると思います。(その場合は、Acrobat Reader等に、1ページ読み進める処理をいれるとか、Get TextやGet OCR Textを使って最大ページ数を取得する、といった方法が必要になるかと思います)

或いは、もう少し複雑になりますが、PDFを開く(おそらくExtract Data、のような名称になってるアクティビティ)のセレクタ(プロパティのInput → Target の中にあります)の、ページ番号的な要素があれば、そこに変数を連結することもできます。
Selectorは表記方法に規則があるとはいえ、実質的には文字列(String型)なので、上記のようなループ内に組み込んで、ページに該当する部分を変数に置き換える処理に使えます。

別の方法として、一度PDFの中身を纏めてRead PDF Textで読み取り、加工するという方法もあります。内容/書式によってはこちらの方がシンプルに纏まることもありますが、プログラミングに近い処理でもあるので、方法の一案として、という感じでしょうか。


#8

@Honoka

ありがとうございます。
以下的外れなことを言っていましたら、すみません。

①「read pdf text→write textファイルについて」
以前よりこの方法は試してみたのですが、少し難しいと感じております。
PDFをテキストファイルに落とすと1列にすべての項目が並んでしまいます。
数字を多く含むPDFですと、PDFによって転記後1列に並んでいますと、どの項目の数字がどれなのか判別がつかない状況になってしまいます。
これをエクセル等の構造データに変換する方法等記載のあるQ&A、xalm例等がございましたら、教えてください。


上記に似たようなことに挑戦している質問がありましたが、回答の参考になれば幸いです。

②教えて頂いたData Scrapingですと、ページごとに、以下のようなフローを作りました。
data scraping、sendhotkeyを繰り返しが出来ないと思われますので、どういった解決法がありますでしょうか?他webサイト等見ても見つからず、公式に問い合わせると時間がかかってしまうので、こちらで質問させて頂きます。



#9

Acrobatでページを切り替えるだけなら、ツールバーにあるページ番号を入力できるテキストボックスに、Type Intoでページ番号を入力するのは如何でしょう。

Type intoのEmptyFieldプロパティをONにして、ページ番号を指定する変数(Int32型)をpageNumとしたとき、
pageNum.ToString().Trim() + “[k(enter)]”
をTypeすると、任意のページに移動できると思います。


Pdfを繰り返し取得しデータテーブルに入れる方法
#10

@Honoka
ありがとうございます。
単純にこの方法であれば、ページダウンはできますね。助かります。
すみません。いろいろ質問してしまって。
あとは、繰り返しの中で、datascraping等ページを読み取ることが課題ですね。
datascrapingはAttach windowにてページを指定しているので、それを繰り返し指定するみたいなことはできないですかね?

また、datascrapingはwhileの中に1個ですが、結果となるDataTableをそのままにすると、内容が上書きされてしまうと思うのですが、追加されていくのですか?
何か宣言した変数に繰り返しの時に宣言した変数を組み合わせてmergeするのでしょうか?

もしくは、事前にbuild on tableでテーブルを作成し、そこにadd data tableで加えるイメージです。