Docly Child

PDFを結合する

77 views

この記事では、複数のPDFを1つに結合する方法を3つ紹介します。

  1. 繰り返しを使わずに2つのPDFを結合する
  2. ブラウザからダウンロードした複数のPDFファイルを結合する
  3. 繰り返しを使って複数のPDFファイルを結合する(ブラウザを使用しない)

 CombinePDF

複数のPDFを1つのPDFに結合する場合は、CombinePDF(PDFファイルを結合する)アクションを使用します。

 繰り返しを使わずにPDFを結合する

まずは繰り返しを使わずに2つのPDFを結合する例を紹介します。
この例では、URLから直接取得した2つのpdfファイルを結合します。

結合に使用するPDFを取得します。

  • DownloadFile(URL上のファイルを取得)アクションを2つ設定します。
  • URLは以下2つとします。
  1. デジタル庁のPDF(デジタル社会の実現に向けた重点計画の概要)
    https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/5ecac8cc-50f1-4168-b989-2bcaabffe870/527fa887/20220607_policies_priority_outline_01.pdf
  2. 国土交通省のPDF(国土交通省 キッズ版)
    https://www.mlit.go.jp/common/001047526.pdf
 
 

結合するPDFをリスト化します。

  • CreateList(リストを作成)アクションを設定します
  • CreateListアクション右のアイコンをクリックします
  • 1のアウトプットを紐づけます

※結合順序は、リストの順序に準拠します。リストの一番上(左)のPDFが結合後のPDFの一番上に来ます。

 
  • CombinePDF(PDFファイルを結合する)を設定します
  • ファイルに、2のアウトプットを指定します

結合されたPDFを確認するため、AUTOROのLocalStorageにファイルを保存します。

  • SaveFile(ファイルを保存)を設定します
  • ファイルに3のアウトプットを指定します
  • ワークフローを実行します
  • ストレージ画面からPDFをダウンロードします

指定した順序で結合できていることが確認できます。
2のリストの順序を逆にすると、PDFの結合順序も逆になります。

# URL上のファイルを取得
+download_file_1:
  action>: DownloadFile
  url: 'https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/5ecac8cc-50f1-4168-b989-2bcaabffe870/527fa887/20220607_policies_priority_outline_01.pdf'

# URL上のファイルを取得
+download_file_2:
  action>: DownloadFile
  url: 'https://www.mlit.go.jp/common/001047526.pdf'

# リストを作成
+create_list_1:
  action>: CreateList
  items: ["+download_file_1","+download_file_2"]

# PDFファイルを結合する
+combine_p_d_f_1:
  action>: CombinePDF
  files: +create_list_1

# ファイルを保存
+save_file_1:
  action>: SaveFile
  provider: local
  filename: +combine_p_d_f_1
  createPath: false

 ブラウザでダウンロードした複数のPDFを結合する

ブラウザ上でダウンロードした複数のPDFファイルを結合する方法を紹介します。

今回は2005年の日銀短観(PDF)をダウンロード対象とします。

  • OpenBrowser(ブラウザを開く)を設定します
  • 以下URLを指定します
    https://www.boj.or.jp/statistics/tk/gaiyo/2001/index.htm

ここでは例として、2005年12月と2005年9月の短観(PDFファイル)をダウンロードします。

  • クリックアクションを設定します。
  • 以下CSSセレクタ(2005年12月)を入力します
    table:nth-of-type(2) tbody tr:nth-of-type(1) a
  • アクションの詳細設定を開きます
  • クリック後のダウンロード完了を待つ(waitForDownload)をONにします

  • もう1つクリックアクションを追加し、CSSセレクタ以外を上記と同じ設定にします
  • 追加したクリックアクションのCSSセレクタ(2005年9月)を以下とします
    table:nth-of-type(2) tr:nth-of-type(2) a

ダウンロードしたファイルのリストを取得します

  • GetDownloadFiles(ダウンロードファイル一覧)を設定します
  • 順序、キーはデフォルトのままにします(昇順、ファイル名順)

ダウンロードしたPDFを結合します。

PDFの結合順序は、GetDownloadFilesの順序(ファイル名の昇順)に準拠します。
今回は、ダウンロードしたPDFのファイル名がデフォルトで「tkaYYMM(YYは西暦下二桁、MMは月)」となっているため、2005年9月の短観が結合後のPDFファイルの一番上に来ます。

最後にクリック要素を一番上にしたい場合は、順序を降順(DESC),キーをファイルの修正時刻(CREATED)としてください。

結合されたPDFを確認するため、AUTOROのLocalStorageにファイルを保存します。

  • SaveFile(ファイルを保存)を設定します
  • ファイルに3のアウトプットを指定します
  • ワークフローを実行します
  • ストレージ画面からPDFをダウンロードします

 

ダウンロードしたファイルの中にpdf以外のファイル(csvなど)が混じっていると、CombinePDFアクションは失敗してしまいます。

このような場合は、SearchItemFromList(リスト内を検索)アクションやRunScriptアクションでpdfファイルのみを抽出し、その抽出結果をCombinePDFのインプットに指定する必要があります。

例:SearchItemFromListでpdfファイルのみを抽出

*.pdf

上記のサンプルでは、ダウンロードのためのクリックアクション1つ1つ設定しました。
しかし、全てのPDFをダウンロードしたいような場合は上記のように1つずつ設定することは非常に手間がかかります。
このような手間を削減したい場合は、ScrapePage(スクレイピング)アクションとForEach(各要素を繰り返す)を使用することで、ページ内の全て、もしくは特定年のPDFを簡易にダウンロードすることが可能です。

実際に2004年のPDFのみを全てダウンロードしたワークフローについては、直下の「ワークフロー設定内容(2004年のPDFを全てダウンロード)」をご参照ください。
スクレイピングアクションの設定方法については、以下もご参照ください。

検索結果のスクレイピング
ScrapePage – AUTORO Document

# 1.ブラウザを開く
+open_browser_1:
  action>: OpenBrowser
  url: 'https://www.boj.or.jp/statistics/tk/gaiyo/2001/index.htm'
  lang: 'ja-JP'
  headless: true
  useShadowDomSelector: false
  private: false

# 2.クリック(PDFダウンロード、2005年12月)
+click_1:
  action>: Click
  browser: +open_browser_1
  selector: 'table:nth-of-type(2) tbody tr:nth-of-type(1) a'
  confirm: true
  ignoreError: true
  timeout: 30000
  waitForDownload: true
  private: false

# 2.クリック(PDFダウンロード、2005年9月)
+click_2:
  action>: Click
  browser: +click_1
  selector: 'table:nth-of-type(2) tr:nth-of-type(2) a'
  confirm: true
  ignoreError: true
  timeout: 30000
  waitForDownload: true
  private: false

# ダウンロードファイル一覧
+get_download_files_1:
  action>: GetDownloadFiles
  order: ASC
  sort_by: FILENAME
  private: false

# PDFファイルを結合する
+combine_p_d_f_1:
  action>: CombinePDF
  files: +get_download_files_1
  private: false

# ファイルを保存
+save_file_1:
  action>: SaveFile
  provider: local
  filename: +combine_p_d_f_1
  createPath: false
  private: false
# ブラウザを開く
+open_browser_1:
  action>: OpenBrowser
  url: 'https://www.boj.or.jp/statistics/tk/gaiyo/2001/index.htm'
  lang: 'ja-JP'
  headless: true
  useShadowDomSelector: false
  private: false

# スクレイピング_2004年のテーブルの中のpdfのリンクのセレクタを指定
+scrape_page_1:
  action>: ScrapePage
  browser: +open_browser_1
  selector: 'table:nth-of-type(4) tbody tr  a'
  text_only: false
  ignoreError: true
  private: false

# 各要素について繰り返す_2004年
+for_each_1:
  for_each>:
    element: +scrape_page_1
  _do:

    # クリック_PDF
    +click_1:
      action>: Click
      browser: +open_browser_1
      selector: ${element.selector}
      confirm: true
      ignoreError: true
      timeout: 30000
      waitForDownload: true
      private: false

# ダウンロードファイル一覧
+get_download_files_1:
  action>: GetDownloadFiles
  order: ASC
  sort_by: FILENAME
  private: false

# PDFファイルを結合する
+combine_p_d_f_1:
  action>: CombinePDF
  files: +get_download_files_1
  private: false

# ファイルを保存
+save_file_1:
  action>: SaveFile
  provider: local
  filename: +combine_p_d_f_1
  createPath: false
  private: false

 繰り返しでPDFを結合する

繰り返しを使用して、複数のPDFファイルを結合する例を紹介します。
以下の例は、ブラウザ操作をせずにURLから直接pdfを取得したり、GetFileアクションで外部ストレージに存在するpdfを結合する場合(GetDownloadFilesアクションが使えない場合)に有効です。

まずは、繰り返し処理するためのリストを作成します。
リスト内の要素は、PDFファイルのURLとなります。

  • CreateList(リストを作成)アクションを設定します
  • CreateListアクション右のアイコンをクリックします
  • 以下のURLを指定します
  1. デジタル庁のPDF(デジタル社会の実現に向けた重点計画の概要)
    https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/5ecac8cc-50f1-4168-b989-2bcaabffe870/527fa887/20220607_policies_priority_outline_01.pdf
  2. 国土交通省のPDF(国土交通省 キッズ版)
    https://www.mlit.go.jp/common/001047526.pdf

繰り返しを使用した場合、CombinePDFアクションのインプットに指定するファイルのリストは、1のURLの数に応じて変化します。

したがって、CombinePDFアクションのインプットには、変数を指定する必要があります。
ここではその変数の初期値を作成します。

  • StoreValue(変数に保存)アクションを設定します
  • 変数名を pdfFilePathList とします
  • 値は空のリスト(空の1次元配列)を意味する [] とします

後の操作で、繰り返し1回毎に1つのPDFファイルがpdfFilePathListに追加されていきます。

※変数名「pdfFilePathList」の由来について:以下2点となります。
・AUTORO実行中に取得されたファイル(ファイル型アウトプット)は、実行中のAUTOROセッションに一次保存されているのファイルのパスを指す文字列となっている
・1のリストが変数であり、その変数名がpdfFileListであったりすると、混同しかねないため

1で作成したURLのリストを繰り返します。

  • ForEach(各要素を繰り返す)を設定します
  • 繰り返すリストに、1のアウトプットを指定します
  • 要素を格納する変数名を、pdfUrlとします

1のリストのPDFファイルを1つダウンロードします。

  • DownloadFileを設定します
  • URL入力欄を${pdfUrl}とします

このアクションのアウトプットが、結合されるpdfファイルとなります。

ダウンロードしたファイルを変数に保存します

  • Storevalueを設定します
  • 変数名をpdfFileとします
  • 値に4のアウトプットを指定します

2で作成された空のリスト(結合に使用するファイルのリスト)に、5で取得したPDFファイルを格納した変数を追加します。

  • StoreValueを追加します
  • 変数名は2と同じpdfFileListとします
  • 値は以下とします
    ${pdfFilePathList.push(pdfFile);pdfFilePathList;}
    ※スクリプトの注釈:2のリストpdfFilePathListに、5でダウンロードしたPDFファイル(変数名pdfFile)を追加(push)した後、この変数の値はファイル追加後の2のリストであると明示/確定しています

これにより、2のリストに、現在の繰り返しでダウンロードされたファイルが追加されます。

繰り返しが終わったら、いよいよPDFを結合します。

  • 繰り返しの範囲を出た直後に、CombinePDFを設定します
  • ファイルに以下を入力します
    ${pdfFilePathList}

結合されたPDFを確認するため、AUTOROのLocalStorageにファイルを保存します。

  • SaveFile(ファイルを保存)を設定します
  • ファイルに7のアウトプットを指定します
  • ワークフローを実行します
  • ストレージ画面からPDFをダウンロードします

結合されて出来上がったPDFファイルは、繰り返しをしない場合の例と同一です。

 

# 1.リストを作成_ダウンロードに使用するURLのリスト
+create_list_1:
  action>: CreateList
  items: ["https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/5ecac8cc-50f1-4168-b989-2bcaabffe870/527fa887/20220607_policies_priority_outline_01.pdf","https://www.mlit.go.jp/common/001047526.pdf"]
  private: false

# 2.変数に保存_PDFファイルのリスト
+store_value_1:
  action>: StoreValue
  key: pdfFilePathList
  value: []
  private: false

# 3.各要素について繰り返す_1のリスト
+for_each_1:
  for_each>:
    pdfUrl: +create_list_1
  _do:

    # 4.URL上のファイルを取得_pdfファイルをダウンロード
    +download_file_1:
      action>: DownloadFile
      url: ${pdfUrl}
      private: false

    # 5.変数に保存_ダウンロードしたpdfファイル
    +store_value_2:
      action>: StoreValue
      key: pdfFile
      value: +download_file_1
      private: false

    # 6.変数に保存_2のリストに5を追加
    +store_value_3:
      action>: StoreValue
      key: pdfFilePathList
      value: ${pdfFilePathList.push(pdfFile);pdfFilePathList;}
      private: false

# 7.PDFファイルを結合する
+combine_p_d_f_1:
  action>: CombinePDF
  files: ${pdfFilePathList}
  private: false

# 8.ファイルを保存
+save_file_1:
  action>: SaveFile
  provider: local
  filename: +combine_p_d_f_1
  createPath: false
  private: false
<ConbinePDF>PDF結合

このページは役に立ちましたか?