Site Tools


software:pdfprocessing:flattenandcompactpdf_a4size

This is an old revision of the document!


FlattenANDCompactPDF_a4size

Please see for the source code below.

Installation

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:

  • The application FlattenANDCompactPDF_A4Size: FlattenANDCompactPDF_A4Size.exe
  • crc32 code: 0xe899d830
  • Either use drag and drop with your pdf or tif file(s) onto the exe, or add the file(s) as argument.
  • History
    • Changes in v0.8b, 29th of July 2011
      • Cleaning up code of the main process due to similarity between processing of tiff and pdf.
      • Fixed a minor bug with page sizes which were almost a4 and did not caused the algorithm to correct for rasterization rounding errors.
    • Changes in v0.8, 28th of July 2011
      • New feature: apart from pdf files, it now also accepts per drag and drop one or more .tif files, which are rescaled and converted so that the resulting file will be a pdf file with exactly a4 page dimensions.
    • Changes in v0.7, Februari 2010
      • Optimize pdf conversion algorithm to increase speed.

Source code

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
1)
Alternatively, when not found, click here: vcredist_x86.exe
software/pdfprocessing/flattenandcompactpdf_a4size.1311904796.txt.gz · Last modified: 2011/07/29 03:59 by admin