@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION :: At least 3 files must be specified: 2 to merge, 1 target file IF "%~3"=="" GOTO Syntax :: Check if GhostScript is available SET GS="" gswin32c.exe -? >NUL 2>&1 && SET GS="gswin32c.exe" gswin64c.exe -? >NUL 2>&1 && SET GS="gswin64c.exe" IF %GS%=="" ( FOR /F "tokens=8" %%A IN ('REG.EXE Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /f GhostScript ^| FIND.EXE "HKEY_"') DO ( FOR /F "tokens=3" %%B IN ('REG.EXE Query "%%~A" /v *UninstallString') DO ( FOR /F "tokens=*" %%C IN ('DIR "%%~B.\..\gswin*c.exe" /B /S') DO ( SET GS="%%~C" ) ) ) ) IF %GS%=="" ( ECHO. ECHO ERROR: GhostScript not found GOTO Syntax ) :: Count the NUMBER of input files SET Count=1 :: List of input files SET InputFile.= :: List of page lists for each input file SET InputFilter.= :: All except the last argument are considered to be PDF input files or page lists :Loop IF /I "%~x1"==".pdf" ( IF "%~2"=="" ( SET OutputFile="%~1" SET /A Count -= 1 ) ELSE ( SET InputFile.!Count!="%~1" SET /A Count += 1 SHIFT GOTO Loop ) ) ELSE ( IF DEFINED InputFilter.!Count! ( ECHO. ECHO ERROR: No more than one page list per input file allowed GOTO Syntax ) SET InputFilter.!Count!=-sPageList=%1 SHIFT GOTO Loop ) :: Empty pagelists should be replaced by "1-" to prevent reusing pagelist of previous input PDF FOR /L %%A IN (1,1,%Count%) DO ( IF NOT DEFINED InputFilter.%%A ( SET InputFilter.%%A=-sPageList=1- ) ) SET Input= FOR /L %%A IN (1,1,%Count%) DO ( SET Input=!Input! !InputFilter.%%A! !InputFile.%%A! ) :: ECHO %GS% -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=%OutputFile% -dBATCH %Input% %GS% -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=%OutputFile% -dBATCH %Input% ENDLOCAL GOTO:EOF :Syntax ECHO. ECHO MergePDFs.bat, Version 3.01 ECHO Merge multiple PDF files into a single new PDF file ECHO. ECHO Usage: MergePDFs [pg1] in1.pdf [pg2] in2.pdf [[pg3] in3.pdf [...]] out.pdf ECHO. ECHO Where: in*.pdf a PDF file to be merged ECHO pg* list of pages of the PDF file with same number ECHO ^(see notes; default: all pages^) ECHO out.pdf the target PDF file ECHO. ECHO Example: MergePDFs.bat "1,3-5" file1.pdf file2.pdf 12- file3.pdf output.pdf ECHO output.pdf will contain pages 1, 3, 4 and 5 of file1.pdf, ECHO all pages of file2.pdf, and page 12 and onwards of file3.pdf. ECHO. ECHO Notes: PDFs will be merged in the specified order. ECHO There are 3 possible values for pg*: "even", "odd" or a list of ECHO pages to be processed; a list can include single pages or ranges of ECHO pages; ranges of pages use the minus sign "-", individual pages and ECHO ranges of pages are separated by commas ","; a trailing minus "-" ECHO means process all remaining pages; doublequote the list if comma's ECHO are used. ECHO This batch file requires GhostScript, available at ECHO https://www.ghostscript.com/ ECHO Existing target files will be overwritten, no questions asked. ECHO GhostScript command by Breno Polanski ECHO https://gist.github.com/brenopolanski/2ae13095ed7e865b60f5 ECHO Return code ^("ErrorLevel"^) 1 in case of errors ECHO or if Ghostscript wasn't found, otherwise 0. ECHO. ECHO Written by Rob van der Woude ECHO https://www.robvanderwoude.com ENDLOCAL EXIT /B 1