00001から10000までの10000フォルダがあり

その中にそれぞれ、
「雛形.pdf」「[フォルダ名]-表面.pdf」「[フォルダ名]-裏面.pdf」
という3種類のPDFがあります。

この3種類のPDFをそれぞれ結合して
10000ファイルのPDFを作成したいです。

何か方法はありますでしょうか?

ソフトはAcrobat8ぐらいしか所有しておりません。
バッチなどでできると良いのですが・・・。

どうぞよろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/04/01 23:18:28
  • 終了:2010/04/02 23:21:53

ベストアンサー

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912010/04/02 12:29:30

ポイント1400pt

すでに紹介がありましたが、ConcatPDF を使用した VBS での実装例です。

先頭で定義した roorFolder(D:\pdfFiles ) 下に00001~10000 フォルダがあると

想定した処理です。


concatPDF は私も愛用していましたが、CUI で使用できるとは今回まで知りませんでした。


一応簡単な動作確認はしていますが、あまり高速にはできないようです。

ですから実行中はログファイルを時々見て進捗状況を確認してみてください。

Option Explicit

	Const rootFolder  = "D:\PDFFiles"      'PDF フォルダがある位置
	Const logFilePath = "D:\concatPDF.log" '実行履歴を出力

	Public objFso
	Set objFso = CreateObject( "Scripting.FileSystemObject" )

	public objLogFile
	Set objLogFile = objFso.CreateTextFile( logFilePath, true )
	
	public objShell
	Set objShell = CreateObject( "WScript.Shell" )

	Dim pFolder
	For Each pFolder In objFso.GetFolder( rootFolder ).SubFolders
		ConcatPDF pFolder
	Next
'----------------------------------------------------------------
Sub ConcatPDF( objFolder )
'----------------------------------------------------------------
	dim pdfFile1, pdfFile2, pdfFile3

	pdfFile1 = pFolder.Path & "\雛型.pdf"
	pdfFile2 = pFolder.Path & "\" & pFolder.Name & "-表面.pdf"
	pdfFile3 = pFolder.Path & "\" & pFolder.Name & "-裏面.pdf"
	if objFso.FileExists( pdfFile1 ) = false Then
		objLogFile.WriteLine Date & " " & Time & ":" & pdfFile1 & " がありません。"
		Exit Sub
	End If
	if objFso.FileExists( pdfFile2 ) = false Then
		objLogFile.WriteLine Date & " " & Time & ":" & pdfFile2 & " がありません。"
		Exit Sub
	End If
	if objFso.FileExists( pdfFile3 ) = false Then
		objLogFile.WriteLine Date & " " & Time & ":" & pdfFile3 & " がありません。"
		Exit Sub
	End If
	
	Dim meargedPDF

	meargedPDF = """" &  pFolder.Path & "\" & pFolder.Name & ".pdf"""
	
	On Error Resume Next
	Err.Clear
	objShell.Run """C:\Program Files\ConcatPDF\ConcatPDF.exe"" /outfile " & meargedPDF _
		  & " """ & pdfFile1 & """ """ & pdfFile2 & """ """ & pdfFile3 & """", 0, True
	On Error Goto 0
	If Err.Number <> 0 Then
		objLogFile.WriteLine "concatPDF の実行に失敗しました。"
		objLogFile.WriteLine "    " & Err.Number & " : " & Err.Description
		Err.Clear
	Else
		objLogFile.WriteLine meargedPDF & " を作成しました。"
	End If
End Sub
id:ohtsu6

Mookさま

できました。ログの件もありがとうございます。

もし可能でしたら変更をお願いさせていただきたいです。

現在の設定では、各フォルダ内にPDFを保存する仕様になっていますが、

「'PDF フォルダがある位置」のように

保存先のフォルダも指定できるようにしたいです。

どうぞよろしくお願いいたします。

2010/04/02 12:56:26

その他の回答(2件)

id:easygoings No.1

easygoings回答回数153ベストアンサー獲得回数202010/04/02 08:23:42

ポイント300pt

すみません、アイデアのみで回答します。

 

ConcatPDFという、フリーのソフトで、CUIベースでPDFの結合ができる

ようですので、バッチファイルを書いたら、できそうです。

 

ConcatPDF

http://www.ujihara.jp/ConcatPDF/ja/

id:ohtsu6

easygoingsさま

ご紹介どうもありがとうございます。

試してみます。

2010/04/02 09:07:02
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912010/04/02 12:29:30ここでベストアンサー

ポイント1400pt

すでに紹介がありましたが、ConcatPDF を使用した VBS での実装例です。

先頭で定義した roorFolder(D:\pdfFiles ) 下に00001~10000 フォルダがあると

想定した処理です。


concatPDF は私も愛用していましたが、CUI で使用できるとは今回まで知りませんでした。


一応簡単な動作確認はしていますが、あまり高速にはできないようです。

ですから実行中はログファイルを時々見て進捗状況を確認してみてください。

Option Explicit

	Const rootFolder  = "D:\PDFFiles"      'PDF フォルダがある位置
	Const logFilePath = "D:\concatPDF.log" '実行履歴を出力

	Public objFso
	Set objFso = CreateObject( "Scripting.FileSystemObject" )

	public objLogFile
	Set objLogFile = objFso.CreateTextFile( logFilePath, true )
	
	public objShell
	Set objShell = CreateObject( "WScript.Shell" )

	Dim pFolder
	For Each pFolder In objFso.GetFolder( rootFolder ).SubFolders
		ConcatPDF pFolder
	Next
'----------------------------------------------------------------
Sub ConcatPDF( objFolder )
'----------------------------------------------------------------
	dim pdfFile1, pdfFile2, pdfFile3

	pdfFile1 = pFolder.Path & "\雛型.pdf"
	pdfFile2 = pFolder.Path & "\" & pFolder.Name & "-表面.pdf"
	pdfFile3 = pFolder.Path & "\" & pFolder.Name & "-裏面.pdf"
	if objFso.FileExists( pdfFile1 ) = false Then
		objLogFile.WriteLine Date & " " & Time & ":" & pdfFile1 & " がありません。"
		Exit Sub
	End If
	if objFso.FileExists( pdfFile2 ) = false Then
		objLogFile.WriteLine Date & " " & Time & ":" & pdfFile2 & " がありません。"
		Exit Sub
	End If
	if objFso.FileExists( pdfFile3 ) = false Then
		objLogFile.WriteLine Date & " " & Time & ":" & pdfFile3 & " がありません。"
		Exit Sub
	End If
	
	Dim meargedPDF

	meargedPDF = """" &  pFolder.Path & "\" & pFolder.Name & ".pdf"""
	
	On Error Resume Next
	Err.Clear
	objShell.Run """C:\Program Files\ConcatPDF\ConcatPDF.exe"" /outfile " & meargedPDF _
		  & " """ & pdfFile1 & """ """ & pdfFile2 & """ """ & pdfFile3 & """", 0, True
	On Error Goto 0
	If Err.Number <> 0 Then
		objLogFile.WriteLine "concatPDF の実行に失敗しました。"
		objLogFile.WriteLine "    " & Err.Number & " : " & Err.Description
		Err.Clear
	Else
		objLogFile.WriteLine meargedPDF & " を作成しました。"
	End If
End Sub
id:ohtsu6

Mookさま

できました。ログの件もありがとうございます。

もし可能でしたら変更をお願いさせていただきたいです。

現在の設定では、各フォルダ内にPDFを保存する仕様になっていますが、

「'PDF フォルダがある位置」のように

保存先のフォルダも指定できるようにしたいです。

どうぞよろしくお願いいたします。

2010/04/02 12:56:26
id:h_kondo No.3

h_kondo回答回数33ベストアンサー獲得回数32010/04/02 23:09:19

ポイント100pt

pdftkというツールを使えばよろしいかと思います。

使い方は

http://www-utheal.phys.s.u-tokyo.ac.jp/~yuasa/wiki/index.php/Pdf...

ダウンロードはこちら

http://www.accesspdf.com/pdftk/

id:ohtsu6

h_kondoさま

どうもありがとうございます。

2010/04/02 23:20:14
  • id:ohtsu6
    ConcatPDFを試してみました。

    Cドライブの直下に
    00001というフォルダがあったと過程して、
    Cドライブの直下に「00001まとめ.pdf」を
    作ろうかと下記のようなバッチファイルを作成しましたが
    PDFは作成されませんでした。

    C:\Program Files\ConcatPDF\ConcatPDF.exe /outfile C:\00001まとめ.pdf C:\00001\雛形.pdf C:\00001\00001-表.pdf C:\00001\00001-裏.pdf

    記述方法におかしな点がありましたら、
    ご指摘をお願いいたします。

    ちなみにGUIでは結合、保存ができました。

    どうぞよろしくお願いいたします。
  • id:Mook
    バッチでは パス中にスペースがあると機能しませんので
    "C:\Program Files\ConcatPDF\ConcatPDF.exe" /outfile C:\00001まとめ.pdf C:\00001\雛形.pdf C:\00001\00001-表.pdf C:\00001\00001-裏.pdf
    とすれば、動くかと思います。

    結合したファイルを一か所におきたい場合、先の回答の
    meargedPDF = """" & pFolder.Path & "\" & pFolder.Name & ".pdf"""

    meargedPDF = """D:\おきたい場所\" & pFolder.Name & ".pdf"""
    のようにすれば、変更できます。
  • id:Mook
    お気づきかもしれませんが、質問のコメントにある保存先を変更する方法は上のコメントに書きました。

    質問のコメント時間が上記よりも後でしたので、一応念のため再コメントします。
  • id:ohtsu6
    Mookさま
    両方ともできました。
    いつもありがとうございます。
  • id:easygoings
    無事解決したようで、何よりです。
    もう要らないかと思いますが、
    いい加減ながら一応バッチ書いちゃったので、載せておきます。
    スピードは、ConcatPDFでの結合自体で時間がかかっているので、
    VBSと大差ないはずです。

    @echo off
    REM 初期値と最大値
    set /a I=1
    set /a MAX=10000

    REM 親フォルダ
    set PATH=D:\PDF

    REM 繰り返し処理
    :LOOP
    REM ディレクトリ名を5桁にそろえる
    set DIRNAME=0000%I%
    set DIRNAME=%DIRNAME:~-5%
    echo 処理中:%DIRNAME%

    REM ファイルの存在確認
    set FILENAME=%PATH%\%DIRNAME%\雛形.pdf
    if not exist %FILENAME% goto NOTEXIST
    set FILENAME=%PATH%\%DIRNAME%\%DIRNAME%-表面.pdf
    if not exist %FILENAME% goto NOTEXIST
    set FILENAME=%PATH%\%DIRNAME%\%DIRNAME%-裏面.pdf
    if not exist %FILENAME% goto NOTEXIST

    REM 処理する
    "C:\Program Files\ConcatPDF\ConcatPDF.exe" /outfile %PATH%\%DIRNAME%\%DIRNAME%まとめ.pdf %PATH%\%DIRNAME%\雛形.pdf %PATH%\%DIRNAME%\%DIRNAME%-表面.pdf %PATH%\%DIRNAME%\%DIRNAME%-裏面.pdf
    if errorlevel 1 (goto FAIL)
    if "%I%"=="%MAX%" (goto EXIT)
    set /a I=I+1
    goto LOOP

    REM 異常終了
    :NOTEXIST
    echo ファイル
    echo %FILENAME%
    echo が存在しないため、処理できませんでした。
    goto EXIT

    REM 異常終了
    :FAIL
    echo エラーが発生し、正しく処理できませんでした。
    goto EXIT

    REM 処理終了
    :EXIT
    echo --------------------------
    echo 処理を終了しました。
    echo 何かキーを押してください。
    pause >NUL
  • id:Mook
    easygoings さんのも面白そうですが気になった点があったので、コメントさせてください。

    ・PATH はシステムが使用している環境変数なので BAT 内での処理には使用しない方が良いかと思います。
     (今回は問題ありませんが、外部コマンドが使えなくなります。)
    ・フォルダなどを順序にを処理するには FOR コマンドが便利だと思います。
     変数を1から10000というような場合も FOR /L %%N IN (1,1,10000) のようにすると簡単です。
    ・CALL を使用するとバッチ内でもサブルーチンのように処理できます。

    私が BAT で書くとしたら下記のような感じでしょうか。
    余計なおせっかいだとは思いましたが、ご参考までに。

    @ECHO OFF
    CLS
    REM ***** 親フォルダ *****
    SET PDF_COM="C:\Program Files\ConcatPDF\ConcatPDF.exe"
    SET DATA_PATH=D:\PDF FOLDER
    SET MRG_PATH=D:\MERGED PDF FOLDER
    FOR /F "DELIMS=" %%F IN ('DIR /B /A:D "%DATA_PATH%"') DO CALL :CONCAT_PDF "%%F"

    ECHO 処理を終了しました。
    PAUSE
    EXIT /B

    REM **************************
    :CONCAT_PDF
    SET FOLDER_NAME=%~1
    SET DST_FOLDER="%DATA_PATH%\%FOLDER_NAME%"
    SET MERGE_FILE="%MRG_PATH%\%FOLDER_NAME%.pdf"
    SET FILENAME1="%DATA_PATH%\%FOLDER_NAME%\雛形.pdf"
    SET FILENAME2="%DATA_PATH%\%FOLDER_NAME%\%~1-表面.pdf"
    SET FILENAME3="%DATA_PATH%\%FOLDER_NAME%\%~1-裏面.pdf"

    ECHO 処理中:%DST_FOLDER%

    REM *** ファイルの存在確認
    IF NOT EXIST %FILENAME1% ( ECHO %FILENAME1% が存在しません。
    EXIT /B )
    IF NOT EXIST %FILENAME2% ( ECHO %FILENAME2% が存在しません。
    EXIT /B )
    IF NOT EXIST %FILENAME3% ( ECHO %FILENAME3% が存在しません。
    EXIT /B )

    %PDF_COM% /outfile %MERGE_FILE% %FILENAME1% %FILENAME2% %FILENAME3%
    IF ERRORLEVEL 1 ( ECHO 正しく処理できませんでした。 )
    EXIT /B
  • id:easygoings
    Mook さん、ご丁寧にありがとうございます!
    #あぁ、もちろん嫌味じゃないですよ(笑)
     
    PATHも、FOR文も、
    あぁ、そうだった・・・って感じですね。
    BATファイルも、秀丸マクロも、使わなくなったからなぁ・・・
    #年がバレますね・・・・
     
    この程度のことでも、アルゴリズムの組み方に、その人の習慣が出ますね。
    存在するディレクトリに列挙して総当りするって考え方は、この条件だったら僕はまずとらないからなぁ
     
    久しぶりにバッチファイル書いて見たりして、意外なことを覚えていたり、忘れていたり、
    いろいろ発見があって面白かったです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません