This is an old revision of the document!
Please see for the source code below.
The program has been written for and tested on a Microsoft Windows XP system with the script language autoit3. In order to function it needs to cooperate with a few other applications, which need to be installed as well. These are Ghostscript and ImageMagick.
NB 1. Microsoft Visual C++ 2008 SP1 should be installed due to incompatibility issues with the script.
NB 2. During installation of ImageMagick you have to enable manually the option “Install ImageMagickObject: OLE Control for VBscript, Visual Basic, and WSH.”
Download and install following files:
Once all files have been downloaded and installed, finally download:
Please note: the code is as is. No warranty is given, nor any support.
; FlattenANDCompactPDF_A4Size, flatten one or more pdf files with multiple layers into compact black & white pdf files. ; Alternatively tif files which are supplied per drag and drop are converted to pdf as well. ; Copyright (C) Februari 2010, July 2011 by Marc Nijdam ; ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/> ; ; Contact details: http://www.nijdam.de/marc.html ; #requireadmin ; This program should have proper rights to start external applications. Presumably this behaviour requires user admin rights #include <Constants.au3> ; Used for registry constants like REG_SZ, REG_DWORD etc. #include <Process.au3> #include <file.au3> #include <GUIConstantsEx.au3> #include <EditConstants.au3> #include <Math.au3> #Include <String.au3> #Include <Array.au3> Global Const $ThisProgramVersion = "0.8b" ; Current release of this software Global Const $ThisProgramDate = "29-07-2011" ; Release date Global Const $ThisProgramName = "FlattenANDCompactPDF_A4Size" ; full filename without spaces and without exe extension ; Dependencies constants Global Const $Ghostscript_name = "gs\gs" ; unique string to search for in %PATH% whether Ghostscript is installed or not Global Const $Ghostscript_RegPath = "HKEY_LOCAL_MACHINE\SOFTWARE\GPL Ghostscript" ; registry path for Ghostscript Global Const $imagemagick_name = "imagemagick" ; unique string to search for in %PATH% whether ImageMagick is installed or not Global Const $imagemagick_RegPath = "HKEY_LOCAL_MACHINE\SOFTWARE\ImageMagick\Current" ; registry path for ImageMagick ; Requires Imagemagick installation from http://www.imagemagick.org (See over there. Choose the dynamic, 16 bit images version) ; Path environment variable should be pointing to imagemagick, (default installation will add this to the %PATH% environment variable, which is persistant) ; If not there, this script adds the following temporarily: %PROGRAMFILES%\imagemagick ; ; This program requires Ghostscript, which may be found at http://sourceforge.net/projects/ghostscript/ ; Path environment variable should be pointing to: %PROGRAMFILES%\gs\gs8.xx\bin;%PROGRAMFILES%\gs\gs8.xx\lib ; ; The following solves a R6034 (AutoIt3 related) error: ; http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2 ; ; Nb.: ; Write an environment variable: EnvSet ( "envvariable" [, "value"] ) ; ControlClick($parentWindowName,"ViewPages", ,2, 12, 81) ; $CmdLine[0] = number of parameters ; $CmdLine[1] = first parameter ; Current temporary filename: pdf2tif00000_etcetera ; Error constants Global Const $_ERROR_MissingImageMagickObject = -1 Global Const $_ERROR_PdfInputFileIsNotValid = -2 Global Const $_ERROR_ShowHelp = -3 Global Const $_ERROR_PdfImageSizeTooLarge = -4 Global Const $_ERROR_CannotFindGhostscript = -5 Global Const $_ERROR_imagemagickNotInstalled = -6 Global Const $_ERROR_MSVisualCPlusPlus2008RedistNotInstalled = -7 Global Const $_ERROR_PDF_FileInconsistent = -8 ; Gui constants Global Const $Gui_Title = $ThisProgramName Global $nEdit ; tif and pdf constants Global Const $resolution = FindResolution(@ScriptName) ; Extract resolution from scriptfile name. All Files and all pages within a batch should have the same resolution. Global Const $rastering = 72 ; PDF rastering value Global Const $img_width = ($resolution/3)*(2480/100); 2480 for a4, constant in pixels, defining what the page width may be at most when portrait modus is used Global Const $img_height = ($resolution/3)*(3508/100) ; 3508 for a4, constant in pixels, defining what the page height may be at most when portrait modus is used Global Const $pdfdims[2] = [String(Int(($rastering*$img_width/$resolution)+0.5)),String(Int(($rastering*$img_height/$resolution)+0.5))] ; Array holding pdf rastering sizes a4 should be 595x842 Global Const $bitmaperror = int($resolution/300) ; To compensate for apparent errors during rasterization of pdf files with ghostscript, a deviation of 1 pixel per 300 dpi will use some quantization Global Const $tif = ".tif" ; File extensie voor tif files Global Const $ps = ".ps" ; File extensie voor ps files Global Const $pdf = ".pdf" ; File extensie voor pdf files ; program specific constants Global Const $Delay=400 ; Short waiting time necessary to retreive console output. Global Const $tempname = @TempDir & "\" & $ThisProgramName & String(StringFormat("%05s", @AutoItPID )) ; Unique name for temporary files Global Const $QQ = '"' Dim $szDrive, $szDir, $szFName, $szExt Dim $i , $j, $k Dim $Pdf_ListOfFiles2Proces = $tempname & "lst.txt" ; Filename for file with list holding each filename for a single pdf page Dim $Pdf_tmp_FileName = $tempname & "Processed" & $pdf ; ###################################################################################################### ; # main ; ###################################################################################################### CheckAndSetEnv() ; Check dependencies and set environment variables GarbageControl($ThisProgramName) ; Cleanup temporary files in $TempDir, but only if no other instances of this program are running. ; Iterate through all via the command line or per 'drag and drop' supplied files $nEdit = CreateGUI($ThisProgramName) ; Create window with info Dim $TotalPages ; Counted pdf pages for each document Dim $tmp Dim $GetFileName Dim $LandscapePages[1] ; Array which holds per page landscape or portrait rotation Dim $PageFitsExact[1] ; Array which holds per page whether it is exactly a4 dimension Dim $FileListArray = SortIfArrayContainsOnlyTiff(GetFileListArray($CmdLine[0])) Const $isPDF = (GetExtension($FileListArray[1]) == $pdf) If $isPDF Then ; check if first (and thus all the rest as well) file is tiff format. True means all the supplied files are For $i = 1 to UBound($FileListArray)-1 $GetFileName = $FileListArray[$i] GUICtrlSetData($nEdit, "###### Processing file " & String($i) & " of " & String(UBound($FileListArray)-1) & " ######" & @CRLF, 1) GUICtrlSetData($nEdit, "Current file: " & RemovePath($GetFileName) & @CRLF & @CRLF, 1) GUICtrlSetData($nEdit, "Analyzing document..." & @CRLF, 1) $TotalPages = Number(CountPdfPages($GetFileName,$tempname)) If $TotalPages == 0 Then ; pdf file contains 0 pages (means wrong type of file) GUICtrlSetData($nEdit, "->Found 0 pages, skipping this file." & @CRLF & @CRLF, 1) Else GUICtrlSetData($nEdit, "->Found " & $TotalPages & " page(s)" & @CRLF, 1) ProcessPages($TotalPages, $isPDF, $GetFileName, $tempname, $Pdf_ListOfFiles2Proces, $FileListArray) EndIf Next Else ; process below tiff files GUICtrlSetData($nEdit, "###### Processing tiff files ######" & @CRLF, 1) $TotalPages = UBound($FileListArray)-1 ; number of suppplied tif files. GUICtrlSetData($nEdit, "->Found " & $TotalPages & " image(s)" & @CRLF, 1) ProcessPages($TotalPages, $isPDF, $GetFileName, $tempname, $Pdf_ListOfFiles2Proces, $FileListArray) EndIf Exit ; ###################################################################################################### ; # Below are functions ; ###################################################################################################### ; ; Receives the amount of arguments, create a list of files to process. As such Array[0] contains the ; number of supplied files and check if this program is invoked through Scite. Func GetFileListArray(Const $count) If @Compiled <> 0 Then If $count == 0 Then ShowError($_ERROR_ShowHelp) ; number of parameters Return $CmdLine Else ; When invoking this program from within the Scite compiler, use some preset variables for which file to use Local $dbg=$tif ; Choose either $tif or $pdf If $dbg == $pdf Then Local $FileNames = StringSplit("test_size-error-2481x3507_page.01.pdf",",") ; Local $FileNames = StringSplit("test_GS_NotA4_IM_AlmostA4.pdf,a4_2480x3508BWtest.pdf",",") ; Local $FileNames = StringSplit("test_GS_NotA4_IM_AlmostA4.pdf,a4_2480x3508BWtest.pdf,test_4_pages_oversized_grey.pdf",",") ; Local $FileNames = StringSplit("test_GS_NotA4_IM_AlmostA4.pdf,a4_2480x3508BWtest.pdf,test_4_pages_oversized_grey.pdf,test_size-error-2481x3507.pdf",",") ; Local $FileNames = StringSplit("test_GS_NotA4_IM_AlmostA4.pdf,a4_2480x3508BWtest.pdf,test_4_pages_oversized_grey.pdf,test_size-error-2481x3507.pdf,test_2_pages_landscape.pdf",",") ; Local $FileNames = StringSplit("test_GS_NotA4_IM_AlmostA4.pdf,a4_2480x3508BWtest.pdf,test_4_pages_oversized_grey.pdf,test_size-error-2481x3507.pdf,test_2_pages_landscape.pdf,test_4_pages_oversized_grey.pdf",",") ; Local $FileNames = StringSplit("test_GS_NotA4_IM_AlmostA4.pdf,a4_2480x3508BWtest.pdf,test_4_pages_oversized_grey.pdf,test_size-error-2481x3507.pdf,test_2_pages_landscape.pdf,test_4_pages_oversized_grey.pdf,buggyfile_2pages_instead_of_18pages.pdf",",") Else ; Local $FileNames = StringSplit("0002_bartok_2.tiff,0001_bartok_1.tiff,0003_bartok_3.tiff,0005_bartok_5.tiff,0004_bartok_4.tiff,test_size-error-2481x3507.pdf",",") Local $FileNames = StringSplit("0002_bartok_2.tiff,0001_bartok_1.tiff,0003_bartok_3.tiff,0005_bartok_5.tiff,0004_bartok_4.tiff",",") EndIf Return $FileNames ; return amount of files. EndIf EndFunc ; Convert accurately a single page from a pdf file into a bitmap tif ; For each page: ; GS_Get_PDF_BoundingBoxes() ; BoundingBox=[lower left x, lower left y, upper right x, upper right y] ; if not available, get [0,0,0,0] ; HiResBoundingBox=[lower left x, lower left y, upper right x, upper right y] ; if not available, get [0,0,0,0] ; When gswin32c outputs error text, indicate with 1, otherwise 0 ; ; A4Quantization=False ; If HiResBoundingBox(lower left x + upper right x, lower left y + upper right y) < BoundingBox(lower left x + upper right x, lower left y + upper right y) Then ; If -1 < Pixel Error < 1 Then ; A4Quantization=True ; EndIf ; Else ; gswin32c -sDEVICE=tiffgray -r300 -dNOPAUSE -dQUIET -dBATCH -dAutoFilterGrayImages=false -dGrayImageFilter=/LZWEncode -dFirstPage=1 -dLastPage=1 -sOutputFile=output.tif input ; IM_Get_Image_Dimension() ; If -1 < Pixel Error < 1 Then ; If IM_Get_PDF_BoundingBox() == 595x842 OR IM_Get_PDF_BoundingBox() == 842x595 Then ; A4Quantization=True ; EndIf ; EndIf ; EndIf ; If A4Quantization=True Then ; gswin32c -sDEVICE=tiffg4 -r300 (-g2480x3508|-g3508x2480) -dMaxStripSize=8192 -dFirstPage=1 -dLastPage=1 -sOutputFile=output.tif input ; EndIf ; Return this_page.pdf Func ExtractPageAsTif(Const $GetFileName, Const $j, Const $resolution, Const $tempname) Local $tmpbase = $tempname & "_" & String(StringFormat("%05s", $j)) & "tmp" Local $GSResults[9], $IMDims[2] Local $x, $y, $xx, $yy, $quantize, $command Local $pagedims[2] ; String holding page dimensions. With a4 at 300 dpi, it is 2480x3508, with landscape 3508x2480 $GSResults = GS_Get_PDF_BoundingBoxes($GetFileName, $j, $resolution); Array holding page dimensions from Ghostscript bbox command and error flag If $GSResults[8] Then ShowError($_ERROR_PDF_FileInconsistent) ; If ghostscript threw an error, maybe not all pages can be retreived. Stopping now is the best option. ; Check for portrait or landscape orientation. If ($GSResults[0] + $GSResults[2]) < ($GSResults[1] + $GSResults[3]) Then $pagedims[0] = $img_width ; page is portrait $pagedims[1] = $img_height Else $pagedims[0] = $img_height ; page is landscape $pagedims[1] = $img_width EndIf ; Check if quantization with 1 pixel necessary If ($GSResults[4] + $GSResults[6]) < ($GSResults[0] + $GSResults[2]) AND _ ; Adding [4] + [6] is not what you would expect when calculating dimensions with coordinates ($GSResults[5] + $GSResults[7]) < ($GSResults[1] + $GSResults[3]) Then ; But either GS or IM is wrong in this. For now it gives accurate results of the page size $x = int($resolution/$rastering * ($GSResults[4] + $GSResults[6])+0.5) ; Width in pixels $y = int($resolution/$rastering * ($GSResults[5] + $GSResults[7])+0.5) ; height in pixels $xx = _Min($x,$y) ; shortest side of image $yy = _Max($x,$y) ; widest side of image If $xx >= ($img_width-$bitmaperror) AND $xx <= ($img_width+$bitmaperror) AND _ ; 1 pixel error at 300 dpi between 2479 and 2481 pixels. $yy >= ($img_height-$bitmaperror) AND $yy <= ($img_height+$bitmaperror) Then $quantize = True $Command = "gswin32c " & _ ; convert file to tif, Mind that you should correct the pixel aspect ratio, which is not shown properly within PSCS4 "-sDEVICE=tiffg4" & " " & _ "-r" & String($resolution) & " " & _ "-g" & String($pagedims[0]) & "x" & String($pagedims[1]) & " " & _ "-dBATCH" & " " & _ "-dNOPAUSE" & " " & _ "-dQUIET" & " " & _ "-dFirstPage=" & Number($j) & " " & _ "-dLastPage=" & Number($j) & " " & _ "-sOutputFile=" & $QQ & $tmpbase & $tif & $QQ & " " & _ $QQ & $GetFileName & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) EndIf EndIf If Not $quantize Then $Command = "gswin32c " & _ ; convert file to tif. Use grayscale: If size exceeds a4, then additonal high quality resizing will be necessary "-sDEVICE=tiffgray" & " " & _ "-r" & String($resolution) & " " & _ "-dBATCH" & " " & _ "-dNOPAUSE" & " " & _ "-dQUIET" & " " & _ "-dAutoFilterGrayImages=false" & " " & _ "-dGrayImageFilter=/LZWEncode" & " " & _ "-dFirstPage=" & Number($j) & " " & _ "-dLastPage=" & Number($j) & " " & _ "-sOutputFile=" & $QQ & $tmpbase & $tif & $QQ & " " & _ $QQ & $GetFileName & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) EndIf $IMDims = IM_Get_Dims($tmpbase & $tif) If $quantize = False Then $x = $IMDims[0] ; Width in pixels $y = $IMDims[1] ; height in pixels $xx = _Min($x,$y) ; shortest side of image $yy = _Max($x,$y) ; widest side of image If $xx >= ($img_width-$bitmaperror) AND $xx <= ($img_width+$bitmaperror) AND _ ; 1 pixel error at 300 dpi between 2479 and 2481 pixels wide. $yy >= ($img_height-$bitmaperror) AND $yy <= ($img_height+$bitmaperror) Then $quantize = True $Command = "gswin32c " & _ ; convert file to tif "-sDEVICE=tiffg4" & " " & _ "-r" & String($resolution) & " " & _ "-g" & String($pagedims[0]) & "x" & String($pagedims[1]) & " " & _ "-dBATCH" & " " & _ "-dNOPAUSE" & " " & _ "-dQUIET" & " " & _ "-dFirstPage=" & Number($j) & " " & _ "-dLastPage=" & Number($j) & " " & _ "-sOutputFile=" & $QQ & $tmpbase & $tif & $QQ & " " & _ $QQ & $GetFileName & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) Return $pagedims EndIf EndIf Return $IMDims EndFunc ; function to process one or more pages. Will do either pdf or tiff Func ProcessPages(Const $TotalPages, Const $isPDF, ByRef $GetFileName, Const $tempname, Const $Pdf_ListOfFiles2Proces, Const $FileListArray) local $LandscapePages[$TotalPages], $PageFitsExact[$TotalPages] local $FilePagesLargestDim[2] ; Dimensions of the largest page found in a current file. local $FilePagesProperties[2] ; $FilePagesProperties[0]=width in pixels, $FilePagesProperties[1]=height in pixels $FilePagesLargestDim[0]=0 $FilePagesLargestDim[1]=0 Local $j, $tmp For $j = 1 to $TotalPages If $isPDF Then GUICtrlSetData($nEdit, "-->Extracting page " & String($j) & " out of " & String($TotalPages) & @CRLF, 1) $FilePagesProperties = ExtractPageAsTif($GetFileName, $j, $resolution, $tempname) ; Convert single pdf page to tif, retreive page dimensions Else GUICtrlSetData($nEdit, "-->processing image " & String($j) & " out of " & String($TotalPages) & @CRLF, 1) $GetFileName = $FileListArray[$j] $FilePagesProperties = IM_Get_Dims($GetFileName) ; get dimensions from tiff file FileCopy($GetFileName,$tempname & "_" & String(StringFormat("%05s", $j)) & "tmp" & $tif) EndIf If $FilePagesProperties[0] < $FilePagesProperties[1] Then ; Keep track of page orientation and largest page dimensions $LandscapePages[$j-1] = False If $FilePagesProperties[0] == $img_width AND $FilePagesProperties[1] == $img_height Then $PageFitsExact[$j-1] = True Else $PageFitsExact[$j-1] = False EndIf Else $LandscapePages[$j-1] = True If $FilePagesProperties[0] == $img_height AND $FilePagesProperties[1] == $img_width Then $PageFitsExact[$j-1] = True Else $PageFitsExact[$j-1] = False EndIf EndIf $FilePagesLargestDim[0] = _Max($FilePagesLargestDim[0],$FilePagesProperties[0]) $FilePagesLargestDim[1] = _Max($FilePagesLargestDim[1],$FilePagesProperties[1]) Next If FileExists($Pdf_ListOfFiles2Proces) Then FileDelete($Pdf_ListOfFiles2Proces) ; Empty this file before adding filenames as text to it. Will be used to merge several pdf files into one. $FHandle = FileOpen($Pdf_ListOfFiles2Proces,1) ; $Pdf_ListOfFiles2Proces is a text file containg file names. (1 = Write mode append to the end of file) Const $ScaleFactor = Calc_scalingfactor($FilePagesLargestDim[0], $FilePagesLargestDim[1], $img_width, $img_height) ; resizing factor to make sure largest page fits within an a4 page. If $ScaleFactor < 100 Then GUICtrlSetData($nEdit, "-->(Some) pages exceed the targeted page output size." & @CRLF & "Resize factor for pages is set to " & String($ScaleFactor) & " percent" & @CRLF, 1) For $j = 1 to $TotalPages ; Resize image GUICtrlSetData($nEdit, "-->Converting page " & String($j) & " out of " & String($TotalPages) & " to pdf" & @CRLF, 1) $tmp = $tempname & "_" & String(StringFormat("%05s", $j)) & "tmp" ConvertScaleTif2Pdf($tmp, $j, $resolution, $ScaleFactor, $LandscapePages[$j-1]) ; Convert single tif page to pdf, retreive page dimensions FileWriteLine($FHandle,$tmp & $pdf & @CRLF) Next Else For $j = 1 to $TotalPages ; Do not resize image GUICtrlSetData($nEdit, "-->Converting page " & String($j) & " out of " & String($TotalPages) & " to pdf" & @CRLF, 1) $tmp = $tempname & "_" & String(StringFormat("%05s", $j)) & "tmp" ConvertTif2Pdf($tmp, $j, $resolution, $PageFitsExact[$j-1], $LandscapePages[$j-1]) ; Convert single tif page to pdf, retreive page dimensions FileWriteLine($FHandle,$tmp & $pdf & @CRLF) Next EndIf FileClose($FHandle) MergePDF_BW($Pdf_tmp_FileName, $Pdf_ListOfFiles2Proces) If $isPDF Then FileCopy($Pdf_tmp_FileName, UniqueFileName(ModifyFileName($GetFileName))) Else FileCopy($Pdf_tmp_FileName, UniqueFileName(ModifyFileName(StripExtension($FileListArray[1]) & $pdf ))) EndIf FileDelete($Pdf_tmp_FileName) IndirectDelete($Pdf_ListOfFiles2Proces) FileDelete($Pdf_ListOfFiles2Proces) EndFunc ; find the pdf HiResBoundingBox with ghostscript. GS String: gswin32c -sDEVICE=bbox -dQUIET -dNOPAUSE -dBATCH file Func GS_Get_PDF_BoundingBoxes(Const $PDFFile, Const $j, Const $resolution) Local $line, $GSResult[9], $Command, $Result = "" $Command = "gswin32c.exe " & _ "-sDEVICE=bbox" & " " & _ ; Ghostview command to get details like HiResBoundingBox "-dQUIET" & " " & _ "-dNOPAUSE"& " " & _ "-dBATCH" & " " & _ "-dFirstPage=" & Number($j) & " " & _ "-dLastPage=" & Number($j) & " " & _ $QQ & $PDFFile & $QQ Local $console = Run(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) While 1 Sleep($Delay) $line = StderrRead($console) If @error Then ExitLoop $Result = $line WEnd $GSResult[0] = Number(StringRegExpReplace($Result, '(?s)%%BoundingBox:[\s]*([\d]+)[\s]+([\d]+)[\s]+([\d]+)[\s]+([\d]+)(.*)', '$1')) $GSResult[1] = Number(StringRegExpReplace($Result, '(?s)%%BoundingBox:[\s]*([\d]+)[\s]+([\d]+)[\s]+([\d]+)[\s]+([\d]+)(.*)', '$2')) $GSResult[2] = Number(StringRegExpReplace($Result, '(?s)%%BoundingBox:[\s]*([\d]+)[\s]+([\d]+)[\s]+([\d]+)[\s]+([\d]+)(.*)', '$3')) $GSResult[3] = Number(StringRegExpReplace($Result, '(?s)%%BoundingBox:[\s]*([\d]+)[\s]+([\d]+)[\s]+([\d]+)[\s]+([\d]+)(.*)', '$4')) $GSResult[4] = Number(StringRegExpReplace($Result, '(?s).*HiResBoundingBox:.*\s(\d+\.\d+).*\s(\d+\.\d+).*\s(\d+\.\d+).*\s(\d+\.\d+).*', '$1')) $GSResult[5] = Number(StringRegExpReplace($Result, '(?s).*HiResBoundingBox:.*\s(\d+\.\d+).*\s(\d+\.\d+).*\s(\d+\.\d+).*\s(\d+\.\d+).*', '$2')) $GSResult[6] = Number(StringRegExpReplace($Result, '(?s).*HiResBoundingBox:.*\s(\d+\.\d+).*\s(\d+\.\d+).*\s(\d+\.\d+).*\s(\d+\.\d+).*', '$3')) $GSResult[7] = Number(StringRegExpReplace($Result, '(?s).*HiResBoundingBox:.*\s(\d+\.\d+).*\s(\d+\.\d+).*\s(\d+\.\d+).*\s(\d+\.\d+).*', '$4')) $GSResult[8] = StringRegExp($Result, '(?s).*error.*') Return $GSResult EndFunc ; find the image dimensions with imagemagick: identify -format "%[fx:w]x%[fx:h]" Func IM_Get_Dims(Const $GetFileName) Local $line, $this_dims[2], $Result = "" Local $Command = "identify " & _ $QQ & "-format" & $QQ & " " & _ ; Ghostview command to get details like HiResBoundingBox $QQ & "%[fx:w]x%[fx:h]" & $QQ & " " & _ ; ImageMagick command to find page dimensions $QQ & $GetFileName & $QQ Local $console = Run(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) While 1 Sleep($Delay) $line = StdoutRead($console) If @error Then ExitLoop $Result = $line WEnd $this_dims[0] = Number(StringRegExpReplace($result, "([0-9]+)x([0-9]+)", "$1")) ; From string holding dimensions (for example "1800x1600") extract first number $this_dims[1] = Number(StringRegExpReplace($result, "([0-9]+)x([0-9]+)", "$2")) ; From string holding dimensions (for example "1800x1600") extract second number Return $this_dims EndFunc Func IM_Get_Type(Const $GetFileName) Local $line, $this_dims[2], $Result = "" Local $Command = "identify " & _ $QQ & "-format" & $QQ & " " & _ ; Ghostview command to get details like HiResBoundingBox $QQ & "%m" & $QQ & " " & _ ; ImageMagick command to find page dimensions $QQ & $GetFileName & $QQ Local $console = Run(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) While 1 Sleep($Delay) $line = StdoutRead($console) If @error Then ExitLoop $Result = $line WEnd If StringLen($Result) >= 3 Then Return "." & StringLower(StringLeft($Result,3)) EndIf Return EndFunc Func ConvertScaleTif2Pdf(Const $tmpbase,Const $j,Const $resolution,Const $Scale, Const $LandscapePage) Local $Command, $pagedims[2] $Command = "mogrify " & _ ; convert tif to ps. (Converting directly to pdf would causes accuracy errors, therefore intermediate step with tif2ps is obligatory) $QQ & $tmpbase & $tif & $QQ & " " & _ "-density " & String($resolution) & " " & _ "-units PixelsPerInch" & " " & _ "-resize " & String($Scale) & "% " & _ $QQ & $tmpbase & $tif & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) If $LandscapePage Then ; make sure page with landscape size has proper dimension $pagedims[0] = $img_height $pagedims[1] = $img_width Else $pagedims[0] = $img_width $pagedims[1] = $img_height EndIf $Command = "convert " & _ ; create canvas with a4 size "-size " & String($pagedims[0]) & "x" & String($pagedims[1]) & " " & _ "xc:white" & " " & _ $QQ & $tmpbase & "B" & $tif & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) $Command = "composite " & _ ; combine a4 canvas with extracted (and resized) tif $QQ & $tmpbase & $tif & $QQ & " " & _ "-density " & String($resolution) & " " & _ "-units PixelsPerInch" & " " & _ "-compose atop" & " " & _ "-gravity Center" & " " & _ "-type Bilevel" & " " & _ "-compress lzw" & " " & _ $QQ & $tmpbase & "B" & $tif & $QQ & " " & _ $QQ & $tmpbase & "C" & $tif & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) If FileExists($tmpbase & "B" & $tif) Then FileDelete($tmpbase & "B" & $tif) ; Delete temp file If FileExists($tmpbase & $tif) Then FileDelete($tmpbase & $tif) ; Delete temp file $Command = "convert " & _ ; convert tif to ps. (Converting directly to pdf would causes accuracy errors, therefore intermediate step with tif2ps is obligatory) "-density " & String($resolution) & " " & _ "-units PixelsPerInch" & " " & _ $QQ & $tmpbase & "C" & $tif & $QQ & " " & _ "-page " & String($pagedims[0]) & "x" & String($pagedims[1]) & "+0+0" & " " & _ $QQ & $tmpbase & $ps & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) If FileExists($tmpbase & "C" & $tif) Then FileDelete($tmpbase & "C" & $tif) ; Delete temp file $Command = "gswin32c " & _ ; convert ps to pdf "-sDEVICE=pdfwrite" & " " & _ "-r" & String($rastering) & " " & _ "-dBATCH" & " " & _ "-dNOPAUSE" & " " & _ "-dQUIET" & " " & _ "-sOutputFile=" & $QQ & $tmpbase & $pdf & $QQ & " " & _ "-dDEVICEWIDTHPOINTS=" & String(Int(($rastering*$pagedims[0]/$resolution)+0.5)) & " " & _ "-dDEVICEHEIGHTPOINTS=" & String(Int(($rastering*$pagedims[1]/$resolution)+0.5)) & " " & _ $QQ & $tmpbase & $ps & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) If FileExists($tmpbase & $ps) Then FileDelete($tmpbase & $ps) ; Delete temp file EndFunc Func ConvertTif2Pdf(Const $tmpbase, Const $j, Const $resolution, Const $PageFitsExactly, Const $LandscapePage) Local $Command, $tf, $pagedims[2] If $LandscapePage Then ; make sure page with landscape size has proper dimension $pagedims[0] = $img_height $pagedims[1] = $img_width Else $pagedims[0] = $img_width $pagedims[1] = $img_height EndIf If $PageFitsExactly Then $Command = "mogrify " & _ ; convert a4 tif file to proper format and compression $QQ & $tmpbase & $tif & $QQ & " " & _ "-density " & String($resolution) & " " & _ "-units PixelsPerInch" & " " & _ "-type Bilevel" & " " & _ "-compress lzw" & " " & _ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) $tf = $tmpbase Else $Command = "convert " & _ ; create canvas with a4 size "-size " & String($pagedims[0]) & "x" & String($pagedims[1]) & " " & _ "xc:white" & " " & _ $QQ & $tmpbase & "B" & $tif & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) $tf = $tmpbase & "C" $Command = "composite " & _ ; combine a4 canvas with extracted (and resized) tif $QQ & $tmpbase & $tif & $QQ & " " & _ "-density " & String($resolution) & " " & _ "-units PixelsPerInch" & " " & _ "-compose atop" & " " & _ "-gravity Center" & " " & _ "-type Bilevel" & " " & _ "-compress lzw" & " " & _ $QQ & $tmpbase & "B" & $tif & $QQ & " " & _ $QQ & $tf & $tif & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) If FileExists($tmpbase & "B" & $tif) Then FileDelete($tmpbase & "B" & $tif) ; Delete temp file If FileExists($tmpbase & $tif) Then FileDelete($tmpbase & $tif) ; Delete temp file EndIf $Command = "convert " & _ ; convert tif to ps. (Converting directly to pdf would causes accuracy errors, therefore intermediate step with tif2ps is obligatory) "-density " & String($resolution) & " " & _ "-units PixelsPerInch" & " " & _ $QQ & $tf & $tif & $QQ & " " & _ "-page " & String($pagedims[0]) & "x" & String($pagedims[1]) & "+0+0" & " " & _ $QQ & $tmpbase & $ps & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) If FileExists($tf & $tif) Then FileDelete($tf & $tif) ; Delete temp file $Command = "gswin32c " & _ ; convert ps to pdf "-sDEVICE=pdfwrite" & " " & _ "-r" & String($rastering) & " " & _ "-dBATCH" & " " & _ "-dNOPAUSE" & " " & _ "-dQUIET" & " " & _ "-sOutputFile=" & $QQ & $tmpbase & $pdf & $QQ & " " & _ "-dDEVICEWIDTHPOINTS=" & String(Int(($rastering*$pagedims[0]/$resolution)+0.5)) & " " & _ "-dDEVICEHEIGHTPOINTS=" & String(Int(($rastering*$pagedims[1]/$resolution)+0.5)) & " " & _ $QQ & $tmpbase & $ps & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) If FileExists($tmpbase & $ps) Then FileDelete($tmpbase & $ps) ; Delete temp file EndFunc ; merge pdf pages into one pdf page and deletes intermediate files Func MergePDF_BW(Const $Pdf_tmp_FileName, Const $Pdf_ListOfFiles2Proces) Local $Command = "gswin32c " & _ ; Merges pdf pages into one pdf file "-sDEVICE=pdfwrite" & " " & _ "-dBATCH" & " " & _ "-dNOPAUSE" & " " & _ "-dQUIET" & " " & _ "-sOutputFile=" & $QQ & $Pdf_tmp_FileName & $QQ & " " & _ $QQ & "@" & $Pdf_ListOfFiles2Proces & $QQ RunWait(@ComSpec & " /c " & $Command, @ScriptDir, @SW_HIDE) EndFunc ; Extract resolution from scriptfile name with regex, if not specifically specified and less than 300 return 300 (dpi) Func FindResolution(Const $ProgramFileName) Return _Max(Number(StringRegExpReplace(@ScriptName, "(.*)(\D+)(\d+)(dpi|.*)(\.)(.*)", "$3")),300) EndFunc ; Find scaling factor to a4 Func Calc_scalingfactor(Const $x1, Const $y1, Const $img_width, Const $img_height) Local $Scale = 1 If _Min($x1,$y1) > $img_width Then $Scale = $img_width/_Min($x1,$y1) EndIf If _Max($x1,$y1) > $img_height Then $Scale = _Min($img_height/_Max($x1,$y1),$Scale) EndIf Return Int($Scale*100) ; Scalingfactor is between 0 and 100; 100 means no change. EndFunc ; Extract file name from path Func RemovePath(Const $OutputFile) If FileExists(RemoveDoubleQuotes($OutputFile)) Then Local $szDrive, $szDir, $szFName, $szExt _PathSplit(RemoveDoubleQuotes($OutputFile), $szDrive, $szDir, $szFName, $szExt) Return $szFName & $szExt Else ShowError("Cannot find working directory") EndIf EndFunc ; This function will remove a trailing slash to a windows file path Func RemoveDoubleQuotes(Const $var) Return StringRegExpReplace($var, "^""(.*)""$","$1") EndFunc Func ModifyFileName(Const $GetFileName) Local $szDrive, $szDir, $szFName, $szExt _PathSplit($GetFileName, $szDrive, $szDir, $szFName, $szExt) Return $szDrive & $szDir & $szFName & "_Processed" & $szExt EndFunc ; Prevent overwriting a file, when it already exists. This function will find the 'first' free filename. Func UniqueFileName(Const $OutputFile) If FileExists(RemoveDoubleQuotes($OutputFile)) Then Local $i = 1 Local $szDrive, $szDir, $szFName, $szExt _PathSplit(RemoveDoubleQuotes($OutputFile), $szDrive, $szDir, $szFName, $szExt) While FileExists($szDrive & $szDir & $szFName & "(" & String($i) & ")" & $szExt) $i += 1 WEnd Return $szDrive & $szDir & $szFName & "(" & String($i) & ")" & $szExt Else Return $OutputFile EndIf EndFunc ; This function will add a trailing slash to a windows file path Func AddSlash(Const $var) Return StringRegExpReplace($var, "(.)\\*$","$1\\") EndFunc ; Create GUI window with console like output Func CreateGUI(Const $ThisProgramName) Const $Gui_Xpos = 140 Const $Gui_Ypos = 23 Const $Gui_Width = 518 Const $Gui_Height = 200 Const $Gui_Border = 15 Const $Gui_HeightButton = 20 Const $Gui_WidthButton = 75 Const $Gui_WidthSlider = 20 Opt("GUIOnEventMode", 1); GUI should be in OnEvent Mode, otherwise our cancelbutton event is not captured HotKeySet("{Esc}", "CancelButton"); Pressing the Escape button cancels operation GUICreate($Gui_Title,$Gui_Width,$Gui_Height,$Gui_Xpos,$Gui_Ypos) ; will create a dialog box that when displayed is centered $nEdit = GUICtrlCreateEdit ("",$Gui_Border,$Gui_Border,$Gui_Width-$Gui_Border-$Gui_WidthSlider,$Gui_Height-$Gui_Border-2*$Gui_HeightButton, BitOr($ES_AUTOVSCROLL,$ES_READONLY,$ES_MULTILINE)) GUICtrlSetBkColor($nEdit, 0xffffff) $hButton = GUICtrlCreateButton ("Cancel", ($Gui_Width-$Gui_WidthButton)/2,$Gui_Height-$Gui_HeightButton*1.5, $Gui_WidthButton, $Gui_HeightButton) GUICtrlSetOnEvent($hButton, "CancelButton") ; Function executed when cancel button is pressed GUISetState() Return $nEdit EndFunc ; Strip path and extension Func StripExtension(Const $OutputFile) If FileExists(RemoveDoubleQuotes($OutputFile)) Then Local $szDrive, $szDir, $szFName, $szExt _PathSplit(RemoveDoubleQuotes($OutputFile), $szDrive, $szDir, $szFName, $szExt) Return $szDrive & $szDir & $szFName Else ShowError("Cannot find working directory") EndIf EndFunc ; Strip everything but the file extension Func GetExtension(Const $OutputFile) If FileExists(RemoveDoubleQuotes($OutputFile)) Then Local $szDrive, $szDir, $szFName, $szExt _PathSplit(RemoveDoubleQuotes($OutputFile), $szDrive, $szDir, $szFName, $szExt) Return StringLower($szExt) Else ShowError("Cannot find working directory") EndIf EndFunc Func IndirectDelete(Const $Pdf_ListOfFiles2Proces) Local $Handle = FileOpen($Pdf_ListOfFiles2Proces, 0) Local $line While 1 $line = FileReadLine($Handle) If @error = -1 Then ExitLoop If FileExists($line) Then FileDelete($line) ; Delete temp file Wend FileClose($Handle) EndFunc ; Find number of PDF pages in document Func CountPdfPages(Const $GetFileName, Const $tempname) Local $Command $Command = $QQ & $GetFileName & $QQ & " " & _ ; Use pdf2dsc to find out the number of pages. E.g. %%Pages: 1 $QQ & $tempname & "info.dsc" & $QQ _RunDos("pdf2dsc " & $Command) $Command = OpenFileAndGrep($tempname & "info.dsc", "%%Pages:") If FileExists($tempname & "info.dsc") Then FileDelete($tempname & "info.dsc") ; Delete dsc file If Not $Command Then Return(0); The supplied file is not a pdf file, in order to skip this file, 0 (pages) will be returned Return(Number(StringReplace($Command, "%%Pages: ", ""))) EndFunc ; Check if first array item is a tiff file, if yes, check all other files for validity as well. If all are tiff files, sort them. ; Sort tif files only on filename, without path Func SortIfArrayContainsOnlyTiff(Const $FileListArray) Local $testfull = False ; False means file will only be tested for occurence of .tif or .tiff in filename. True means each file will be tested by ImageMagick (This is slow) If $testfull Then if IM_Get_Type($FileListArray[1]) == $pdf Then Return $FileListArray ; Test at least the first file comprehensive. Else if StringLeft(GetExtension($FileListArray[1]),4) == $pdf Then Return $FileListArray ; Simple test for pdf or tiff file EndIf Local $i = 1 Local $ft Local $temp1[UBound($FileListArray)-1][2] Local $temp2[UBound($FileListArray)] If $testfull Then GUICtrlSetData($nEdit, "###### Now verifying if all supplied files are tif files ######" & @CRLF, 1) ; Display only progression text when Do If $testfull Then GUICtrlSetData($nEdit, "Checking file " & String($i) & " of " & String(UBound($FileListArray)-1) & " ... ", 1) $ft = IM_Get_Type($FileListArray[$i]) ; Comprehensive test GUICtrlSetData($nEdit, $ft & @CRLF, 1) Else $ft = StringLeft(GetExtension($FileListArray[$i]),4) ; Either select this line, or the following to check for tif validity. EndIf If $ft <> $tif Then ShowError("Not all files are tif files. Please supply either only pdf or only tif files.") $temp1[$i-1][0] = RemovePath($FileListArray[$i]) $temp1[$i-1][1] = $FileListArray[$i] $i = $i + 1 Until ($i >= UBound($FileListArray)) _ArraySort($temp1) ; $temp2[0] = UBound($temp1) For $i=1 to UBound($temp1) $temp2[$i] = $temp1[$i-1][1] Next Return $temp2 EndFunc ; Opens a file and returns a line which contains a grep alike specified keyword Func OpenFileAndGrep(Const $OFAG_path,Const $OFAG_query) Local $OFAG_file = FileOpen($OFAG_path,0) Local $OFAG_result = FileRead($OFAG_file) FileClose($OFAG_file) If $OFAG_result = "" Then ; If string is empty, return empty string as well Return Else Local $OFAG_q = "" Local $OFAG_stdinArray = StringSplit($OFAG_result, @LF, 1) ; put read data, separated by LineFeed characters, in an array Local $OFAG_i For $OFAG_i In $OFAG_stdinArray If StringInStr($OFAG_i,$OFAG_query) Then $OFAG_q &= $OFAG_i ExitLoop EndIf Next EndIf return $OFAG_q EndFunc ; Cleanup temporary files in $TempDir, but only if no other instances of this program are running. Func GarbageControl(Const $ThisProgramName) Local $i Local $count = 0 Local $list = ProcessList() For $i = 1 to $list[0][0] If $list[$i][0] = $ThisProgramName & ".exe" Then $count = $count+1 Next If $count == 1 Then If FileExists(@TempDir & "\" & $ThisProgramName & "*") Then FileDelete(@TempDir & "\" & $ThisProgramName & "*") ; Delete temporary files EndIf EndFunc ; Check MS dependencies and set environment variables for Imagemagick, Ghostscript Func CheckAndSetEnv() If Not Find_MS_Visual_C_PlusPlus_2008_SP1_Redist() Then ShowError($_ERROR_MSVisualCPlusPlus2008RedistNotInstalled) If Not FileExists(Find_imagemagick_Path("HKEY_LOCAL_MACHINE\SOFTWARE\ImageMagick\Current","BinPath") & "\ImageMagickObject.dll") Then ShowError ($_ERROR_Need_ImageMagickObject_OLE) ; If Not FileExists(@SystemDir & "\ImageMagickObject.dll") Then FileInstall("ImageMagickObject.dll",@SystemDir&"\ImageMagickObject.dll",0) If Not EnvPathExists(Find_Ghostscript_Path($Ghostscript_RegPath,"GS_LIB")) Then SetEnvPath(Find_Ghostscript_Path($Ghostscript_RegPath,"GS_LIB")) ; Check if gs path should be added to %PATH% if it's not there already If Not EnvPathExists(Find_imagemagick_Path($imagemagick_RegPath,"BinPath")) Then SetEnvPath(Find_imagemagick_Path($imagemagick_RegPath,"BinPath")) ; Check if imagemagick path should be added to %PATH% if it's not there already ; If Not ObjectIsRegistered("HKEY_CLASSES_ROOT\ImageMagickObject.MagickImage\CurVer", "") Then RunWait(@ComSpec & " /c regsvr32 /s MagickObject.dll",@SystemDir,@SW_HIDE) EndFunc ; Find Microsoft Visual C++ 2008 SP1 Redistributable Package Func Find_MS_Visual_C_PlusPlus_2008_SP1_Redist() Local $var $var = RegRead("HKEY_CLASSES_ROOT\Installer\Products\D20352A90C039D93DBF6126ECE614057","PackageCode") If @error <> 0 Or $var == "" Then Return False Return True EndFunc ; This function makes sure that the to be added $EnvironmentVariablePath is only added once to the environment path. For this it differentiates between Ghostscript and ImageMagick Func SetEnvPath(Const $EnvVarApplication) If StringRight(EnvGet("PATH"),1) <> ";" Then EnvSet("PATH",EnvGet("PATH") & ";") ; Add a ; separator between path if it's not there already Local $i Local $SplitEnvVarApplication = StringSplit($EnvVarApplication,";") If @error == 1 Then EnvSet("PATH", EnvGet("PATH") & $EnvVarApplication) Else For $i = 1 To $SplitEnvVarApplication[0] If Not StringInStr(EnvGet("PATH"),$SplitEnvVarApplication[$i]) Then EnvSet("PATH", EnvGet("PATH") & $SplitEnvVarApplication[$i] & ";") Next EndIf EndFunc ; This function checks whether the (part of the) $EnvVarApplication already exists in the %PATH% environment. Func EnvPathExists(Const $EnvVarApplication) Local $i Local $found = True Local $SplitEnvVarApplication = StringSplit($EnvVarApplication,";") If @error == 1 Then If StringInStr(EnvGet("PATH"), $EnvVarApplication) Then Return $found ; The delimiter character ; had not been found Else For $i = 1 To $SplitEnvVarApplication[0] If Not StringInStr(EnvGet("PATH"),$SplitEnvVarApplication[$i]) Then $found=False ; One or more applications in the path had been found Next EndIf Return $found EndFunc ; Find Ghostscript Path Func Find_Ghostscript_Path(Const $Ghostscript_RegHive, Const $Ghostscript_EnvKey) Local $var Local $var_read Local $i = 1 Local $GhostscriptVersion Local $GhostscriptPath Local $GhostscriptFound = False Local $GhostscriptPathFound = False While 1 $var = RegEnumKey($Ghostscript_RegHive, $i) If @error <> 0 Then ExitLoop If StringRegExp($var,"^[0-9]+\.[0-9]+") Then $GhostscriptVersion = String($var) $GhostscriptFound = True EndIf $i += 1 WEnd $i = 1 If $GhostscriptFound Then While 1 $var = RegEnumVal($Ghostscript_RegHive & "\" & $GhostscriptVersion, $i) If @error <> 0 Then ExitLoop If $var == $Ghostscript_EnvKey Then $GhostscriptPath = RegRead($Ghostscript_RegHive & "\" & $GhostscriptVersion, $Ghostscript_EnvKey) & ";" $GhostscriptPath &= StringRegExpReplace($GhostscriptPath, "(?i)(.*)(c:\\.*)lib;.*", "$2bin") ; Add also the ghostscript bin path $GhostscriptPathFound = True ExitLoop EndIf $i += 1 WEnd EndIf If $GhostscriptPathFound Then Return $GhostscriptPath Else ShowError ($_ERROR_CannotFindGhostscript) EndIf Return EndFunc ; Find imagemagick Path Func Find_imagemagick_Path(Const $imagemagick_RegHive, Const $imagemagick_EnvKey) Local $var $var = RegRead($imagemagick_RegHive,$imagemagick_EnvKey) If @error <> 0 Or $var == "" Or StringInStr($var,$imagemagick_name) == 0 Then ShowError ($_ERROR_imagemagickNotInstalled) Return $var EndFunc ; Find if object is already registered Func ObjectIsRegistered(Const $Obj_RegHive, Const $Obj_Key) Local $var $var = RegRead($Obj_RegHive,$Obj_Key) If @error <> 0 Or $var <> "ImageMagickObject.MagickImage.1" Then Return False Return True EndFunc ; Cancel button had been pressed. A few cleanup steps should take place. Func CancelButton() GUIDelete() If FileExists($tempname & "*") Then FileDelete(AddSlash(@TempDir) & $tempname & "*") ; Delete temporary files Exit EndFunc ; Show related error, try to terminate program properly Func ShowError(Const $_ERROR_Number) Switch $_ERROR_Number ; Case $_ERROR_MissingImageMagickObject ; MsgBox(0,"Error", "ImageMagickObject cannot be registered." & _ ; "Maybe it is already registered.") Case $_ERROR_PdfInputFileIsNotValid MsgBox(0,"Error", "Supplied PDF file is invalid." & @CRLF & @CRLF & _ "Please check your pdf file.") Case $_ERROR_ShowHelp MsgBox(0,"Help", $Gui_Title & " v" & $ThisProgramVersion & @CRLF & _ "Written by Marc Nijdam, " & $ThisProgramDate & @CRLF & @CRLF & _ "Usage:" & @CRLF & _ StringRegExpReplace(@ScriptName, "(?i)(.*)(\.)(au3|exe)(.*)", "$1$4 ") & "<inputfile1> [<inputfile 2> ... <inputfile n>]"& @CRLF & _ "[...] is optional"& @CRLF & _ "Resolution is: " & $resolution & "dpi" & @CRLF & _ "Resolution can be added optionally within the filename") Case $_ERROR_PdfImageSizeTooLarge MsgBox(0,"Error", "Image size of PDF file is too large." & @CRLF & @CRLF & _ "Processing would not make much sense.") Case $_ERROR_CannotFindGhostscript MsgBox(0,"Error", "Ghostscript is not installed." & @CRLF & @CRLF & _ "Please go to:" & @CRLF & _ "http://sourceforge.net/projects/ghostscript/" & @CRLF & @CRLF & _ "From there, download and install Ghostscript.") Case $_ERROR_imagemagickNotInstalled MsgBox(0,"Error", "ImageMagick is missing." & @CRLF & @CRLF & _ "Please go to:" & @CRLF & _ "http://www.imagemagick.org/script/binary-releases.php#windows" & @CRLF & @CRLF & _ "From there, download the Q16-windows-dll version." & @CRLF & @CRLF & _ "Make sure the installation option " & $QQ & "Install ImageMagickObject" & @CRLF & _ "OLE Control for VBscript, Visual Basic, and WSH." & $QQ & " is enabled.") Case $_ERROR_MSVisualCPlusPlus2008RedistNotInstalled MsgBox(0,"Error", "Microsoft Visual C++ 2008 SP1 is not available." & @CRLF & @CRLF & _ "Please go to:" & @CRLF & _ "http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2" & @CRLF & @CRLF & _ "From there, download and install vcredist_x86.") Case $_ERROR_PDF_FileInconsistent MsgBox(0,"Error", "The current processed pdf file contains some errors." & @CRLF & @CRLF & _ "To prevent further bad results, you could" & @CRLF & _ "try to open the file with a pdf viewer and" & @CRLF & _ "print from there to a pdf file to get a" & @CRLF & _ "new and more consistent pdf file.") Case Else MsgBox(0,"Error", String($_ERROR_Number)) EndSwitch Exit EndFunc