Option Explicit
'Need to set these references using Tools /
References:
'Microsoft Scripting Runtime
'Adobe Acrobat 5.0 Type Library
Const POSTSCRIPT_LEVEL = 2
Const PDF_WILDCARD = "*.pdf"
'Avoid having to load Acrobat for each file printed
Private AcroExchApp As Object
'Static variable - keep track of total page count
Private miPages
As Integer
'************************************************************************
Private Sub Command1_Click()
'************************************************************************
Dim lsDir As String
Set AcroExchApp = CreateObject("AcroExch.App")
'Change this as desired
lsDir = "G:\ea2F\2006 cd-rom\Handouts\Section7"
If MsgBox(lsDir & "- is this the correct
directory?", vbYesNo, "Merge Acrobat PDF files") = vbYes Then
'Merge PDF
files
Call
LoadPrintList(lsDir & "\")
'Close
Acrobat Exchange
AcroExchApp.Exit
'Show page
count
Debug.Print "Page
count "; miPages
End If
'Comment this out for VBA
'Unload Me
End Sub
'************************************************************************
Private Sub LoadPrintList(ByVal bsFolder As String)
'************************************************************************
Dim lsNames(100) As String
Dim liNum As
Integer
If LoadFileNames(ByVal bsFolder, lsNames, liNum) = True Then _
Call
MergeListPDF(ByVal bsFolder, lsNames, ByVal liNum)
End Sub
Private Sub MergeListPDF(ByVal bsFolder As String, _
asNames() As String,
ByVal biNum As Integer)
Dim liCnt As Integer
Dim loFso As New
FileSystemObject
Dim loFil As File
Set loFso =
CreateObject("Scripting.FileSystemObject")
On Error GoTo
ErrHandler
'Load each
file, one at a time
For liCnt = 1 To biNum
Set loFil =
loFso.GetFile(bsFolder + asNames(liCnt))
If
MergeOnePDF(bsFolder, asNames(liCnt)) = False Then GoTo ErrHandler
Next
Exit Sub
ErrHandler:
Stop
'For
debugging
Resume
End Sub
'************************************************************************
Private Function LoadFileNames(ByVal bsFolderPath As String, _
asNames() As String,
aiNum As Integer) As Boolean
'************************************************************************
Dim lsPDFList As String
Dim liUnit As
Integer 'Unit number for file I/O
Dim liCnt As
Integer 'Index for array of file
names
Dim lsData As
String 'Original record from INI
file
liUnit = FreeFile
LoadFileNames = False
If Dir$(bsFolderPath
& "pdf.txt") <> "" Then
Debug.Print
bsFolderPath & "pdf.txt"
'Data
file pdf.txt created by using Pdfdir.bat:
'
'@echo
off
'Rem
'Rem
This produces list of PDF file names
'Rem
in sorted order (alphabetic)
'Rem
'dir
*.pdf /B /O:N >pdf.txt
'Now
need to read file names from data file
Open bsFolderPath
& "pdf.txt" For Input As #liUnit
Do
Line Input
#liUnit, lsData
'Added for testing
If
LCase$(Trim$(lsData)) = "stop" Then GoTo StopLooping
liCnt = 1 +
liCnt
'Load into array
asNames(liCnt)
= lsData
Debug.Print
liCnt; " "; asNames(liCnt)
Loop Until
EOF(liUnit)
StopLooping:
Close (liUnit)
'Return count of file names
aiNum = liCnt
'Indicate success
LoadFileNames =
True
Else
'Indicate failure
MsgBox
"PDF.txt file not found", , bsFolderPath & "pdf.txt"
End If
End Function
'This is a modified version of a routine from
PlanetPDF
' That routine allowed you to insert a single page
multiple times in one file
'
'The routine is HowToImportTheSamePageManyTimes,
located here:
'http://www.planetpdf.com/developer/article.asp?ContentID=iac_importing_single_pages
'************************************************************************
Function MergeOnePDF(ByVal bsFolder As String, ByVal bsFileName
As String) As Boolean
'************************************************************************
Dim
AcroExchPDDocTarget As Object
Dim
AcroExchPDDocSource As Object
Dim strSourceFileName
As String
Dim strPath As String
Dim strTargetFileName
As String
Dim
iSourcePageToInsert As Integer
Dim
iTargetPageToInsertAfter As Integer
Dim iInsertCount As
Integer
Dim iNumberPages As
Integer
Debug.Print bsFolder;
bsFileName
' Create
our PDDoc object
Set
AcroExchPDDocTarget = CreateObject("AcroExch.PDDoc")
' Show the
Acrobat Exchange window
AcroExchApp.Show
' Set the
path
'strPath =
WORKING_PATH
strPath = bsFolder
' Set the
target file
strTargetFileName =
"merged.pdf"
' Set the
page to insert after (note this is being converted to base 0)
iTargetPageToInsertAfter = miPages
' Open the
target file (the file that we wish to insert pages into)
If
(AcroExchPDDocTarget.Open(strPath + strTargetFileName) = False) Then
MsgBox "Could
not open " + strPath + strTargetFileName
Exit Function
End If
' Set the
source filename
strSourceFileName =
bsFileName
' Open the
source file (that contains the page we wish to insert)
Set
AcroExchPDDocSource = CreateObject("AcroExch.PDDoc")
If
(AcroExchPDDocSource.Open(strPath + strSourceFileName) = False) Then
MsgBox "Could
not open " + strPath + strSourceFileName
Exit Function
End If
' Get the
number of pages for source pdf
iNumberPages =
AcroExchPDDocSource.GetNumPages
'Always
insert at same location - must insert pages in reverse order
For
iSourcePageToInsert = iNumberPages - 1 To 0 Step -1
'
Insert the pages
If
(AcroExchPDDocTarget.InsertPages(iTargetPageToInsertAfter, AcroExchPDDocSource,
_
iSourcePageToInsert, 1, True) = False) Then
'Do
nothing
'77777777777777777777777777777777777777777777777777777777777777777777
'un-comment these lines for Acrobat 7
'comment these lines for Acrobat 5
Else
'Acrobat 7 - only need to insert once
Exit For
'77777777777777777777777777777777777777777777777777777777777777777777
End If
Next
'Keep track of total pages in target PDF
miPages = miPages +
iNumberPages
' Close
the source document
AcroExchPDDocSource.Close
' Save the
entire target document where it was
'*****
note
'this
saves over the top of the existing file
AcroExchPDDocTarget.Save &H1, strPath +
AcroExchPDDocTarget.GetFileName
' Close
the PDDoc
AcroExchPDDocTarget.Close
' Cleanup
the Acrobat objects
Set
AcroExchPDDocTarget = Nothing
Set
AcroExchPDDocSource = Nothing
MergeOnePDF = True
End Function