質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

3503閲覧

powershellでPDFを結合する

MSHK

総合スコア4

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2020/01/27 15:42

powershellでPDFを結合する

power shell にて大量のPDFファイルの結合を実施したいと思っております。
100ファイルから200ファイル程です。
itextsharp.dllを用いて、以下のコードで対応できております。

該当のコード

# dll呼出 [System.Reflection.Assembly]::LoadFrom("C:\Program Files\itextsharp.dll") # pdf 指定 ################################################################################################################################### $K1960398 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\mshk\Documents\test\01_date\K1960398\K1960398.pdf") $K1960102 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\mshk\Documents\test\01_date\K1960102\K1960102.pdf") $K1960103 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\mshk\Documents\test\01_date\K1960103\K1960103.pdf") $K1960104 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\mshk\Documents\test\01_date\K1960104\K1960104.pdf") $K1960399 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\mshk\Documents\test\01_date\K1960399\K1960399.pdf") ################################################################################################################################### # PDF 作成 $new_pdf = New-Object System.IO.FileStream("C:\Users\mshk\Documents\pdf\test.pdf", [System.IO.FileMode]::OpenOrCreate) # pdfファイル追加 $copy = New-Object iTextSharp.text.pdf.PdfCopyFields($new_pdf) ################################################################################################################################### $copy.AddDocument($K1960398) $copy.AddDocument($K1960102) $copy.AddDocument($K1960103) $copy.AddDocument($K1960104) $copy.AddDocument($K1960399) ################################################################################################################################### $copy.Close() $new_pdf.Close() $K1960398.Close() $K1960102.Close() $K1960103.Close() $K1960104.Close() $K1960399.Close()

発生している問題・エラーメッセージ

ただ、このコードだと、100ファイルを結合するとなると、
$K196*** = New-object iTextSharp.text.pdf.pdfreader("******.pdf")で100行
$copy.AddDocument($K196***)で100行
$K196***.Close()でも100行

合計300行、入力しなければならず非常に時間をとられております。
また、タイプミスも頻発しております。
コード量を減らす方法が無いかと、検索をしたのですが、よい方法が見つからず、
こちらで質問をさせていただく次第です。
どうぞよろしくお願いいたします。

補足情報

OS:windows10
powershell:ver5.0

pdfファイルは、全てK196***.pdf番号で管理しております。
番号と内容の一覧表があり、それを元に管理しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ファイル一覧のテキストファイルをあらかじめ作っておいて、それを1行ずつ取り込んで
処理するのではダメですか?

[input.csv]
C:\Users\mshk\Documents\test\01_date\K1960398\K1960398.pdf
C:\Users\mshk\Documents\test\01_date\K1960102\K1960102.pdf
C:\Users\mshk\Documents\test\01_date\K1960103\K1960103.pdf
C:\Users\mshk\Documents\test\01_date\K1960104\K1960104.pdf
C:\Users\mshk\Documents\test\01_date\K1960399\K1960399.pdf

$list = Get-Content -Path ./input.csv foreach($item in $list) { $item }

投稿2020/01/27 16:21

technocore

総合スコア7209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MSHK

2020/01/27 23:43

回答ありがとうございます。 実施して、何かありましたら。 書き込み致します。 ありがとうございました。
Zuishin

2020/01/27 23:48

Get-ChildItem | Foreach-Object FullName > input.csv でファイルリストを作って順番をテキストエディタのカットアンドペーストで入れ替えたら打ち間違いは無くなりますね。
MSHK

2020/01/28 15:29

>technocorecrissさん 回答ありがとうございます。 input.csvと上のコードにて、以下のように書き換えました。 ``` $list = get-content -path ./input.csv foreach($item in $list) { $item } # iTextSharp.dll呼出 [System.Reflection.Assembly]::LoadFrom("C:\Program Files\itextsharp.dll") $pdfcomb = New-object iTextSharp.text.pdf.pdfreader($item) $new_pdf = New-Object System.IO.FileStream("C:\Users\mshk\Documents\pdf\test.pdf", [System.IO.FileMode]::OpenOrCreate) $copy = New-Object iTextSharp.text.pdf.PdfCopyFields($new_pdf) $copy.AddDocument($item) $copy.Close() $new_pdf.Close() $item.Close() ``` 実行すると、例外が発生しました、型変換できませんでした。とエラーメッセージが表示されました。 色々修正して、試して見ましたが、上手く行きません。 csvと$itemを使用するとこのコードはどのようになるのでしょうか。 度々のお願いで申し訳ありませんが、よろしくお願いいたします。
MSHK

2020/01/28 15:34

>Zuishinさん 回答ありがとうございます。 色々試しております。 もう少しお時間頂けないでしょうか。
Zuishin

2020/01/28 15:44

回答していません。前回の質問を見てやめました。
MSHK

2020/01/30 14:56

ここでのアドバイスを元に、修正した所、 PDFの結合を行う事ができました。 本当にありがとうございました。
Takumiboo

2020/01/31 00:20

ちなみにファイルリストを作るなら、エクスプローラで対象のファイルを選択状態にしてShift+右クリックで「パスのコピー」が出来るので、PowerShell等使わないでも一瞬でファイルリストが作れますね。 複数フォルダあるとかだと一発では無理ですが。
Zuishin

2020/01/31 00:46

PowerShell の質問なのでわざわざエクスプローラを立ち上げなくても PowerShell でできる方法を書きましたが、一個一個手打ちで書くのは流石に前時代的すぎますね。
Takumiboo

2020/01/31 01:39

手打ちはしんどいですね…(笑)
guest

0

一覧表がすでに用意されているなら、Excelなどで作ってしまえば一瞬では?
例えばA1-A100に番号を入れて、B1に「="$copy.AddDocument($"&A1&")"」にしてB100までコピーすれば、100回繰り返したい行が一瞬で作れますよね。
プログラミングでの解決ではありませんが、こういう方法もありますよ、ってことで。

普通だったら別の方が答えているようにファイルリストを読み込むとか、そもそもその取得もするとか、そういうほうが一般的かと思いますけど。

投稿2020/01/27 22:28

Takumiboo

総合スコア2534

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MSHK

2020/01/27 23:42

回答ありがとうございます。 本日実施してみます。 実施しましたら、また書き込みいたします。 ありがとうございました。
MSHK

2020/01/28 13:57

回答おそくなってしまい申し訳ありません。 なるほど、そういった方法もありますね。 コードでの解決方法ばかり考えており、 その様な解決策はまったく、思いつきませんでした。 何事も、色々な視点で見て、考える事が大事ですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問