VBS: via Regex Begriff finden

amn.ssy

Erfahrenes Mitglied
Hallo,

eigendlich sollte es ja nicht so schwer sein - dachte ich jedenfalls:
Das folgenden Script druckt aus jeder PDF eine ganz bestimmte Seite aus - in diesem Fall die Seite 5.
Das klappt aus sehr gut :)

Visual Basic:
InFile = Wscript.Arguments(0)					        '' get file to open
set App = CreateObject("AcroExch.App")     			'' start Adobe Acrobat
'App.Show                           				                '' show Acrobat

set AVDoc = CreateObject("AcroExch.AVDoc") 		'' connect to Ac Viewer
AVDoc.Open InFile,""              				                '' Open a file into viewer
set PDDoc = AVDoc.GetPDDoc             				'' Get the Doc opened in the viewer
set JSO = PDDoc.GetJSObject            				'' Connect to Acrobat JS
'JSO.app.alert("Hi, file is open.Press Ok for printing")  	'' Display a MsgBox

'//JSO.print("bUI","nStart","nEnd","bSilent","bShrinkToFit","bPrintAsImage","bReverse","bAnnot","bprintParams")

'endPage = jso.numPages-1 					         ''nEnd zeroBased 
set pp = JSO.getPrintParams()  					''contact print parameters
pp.printerName = "Brother-DCP-7025"       			''set a printername
JSO.print False,5,5,False,True,False,False,False,pp   	'' print with some options

JSO.closeDoc(True)       					                '' close the printed doc
App.CloseAllDocs           					                '' - or /and - close all docs
App.exit

Nun können die PDF jedoch unterschiedlich viele Seiten beinhalten und die Seite die ausgedruckt werdern soll ist in einem Fall ("Monthly") immer die letzte Seite bzw. (bei "Baseline") immer die vorletzte Seite.

Hierzu habe ich ein Script gefunden und getestet, welches die Anzahl der Seiten (Page) ausließt - das geht auch.
Ich möchte das nun zum einen dahin erweitern, daß gleichzeitig nach dem Begriff "Monthly" gesucht wird (muß nur vorhanden sein) um zum anderen an das Script oben den Pagecount (ggf. -1 wenn <> Monthly) zu übergeben.

Visual Basic:
Option Explicit

Private Function getPdfDocClass(ByVal sPath)
    Dim strTStr, found

    With CreateObject("Adodb.Stream")
        .Open
        .Charset = "x-ansi"
        .LoadFromFile sPath
        strTStr = .ReadText(-1)
    End With

    With (New RegExp)
        .Pattern = "Monthly"
        .IgnoreCase = True
        .Global = True
        found = .test(strTStr)
    End With

    If  found = true then
	getPdfDocClass = "Monthly"
    else
	getPdfDocClass = "Baseline"
    end if

End Function


Private Function getPdfPgCnt(ByVal sPath)
    Dim strTStr

    With CreateObject("Adodb.Stream")
        .Open
        .Charset = "x-ansi"
        .LoadFromFile sPath
        strTStr = .ReadText(-1)
    End With

    With (New RegExp)
        .Pattern = "Type\s*/Page[^s]"
        .IgnoreCase = True
        .Global = True
        getPdfPgCnt = .Execute(strTStr).Count
    End With

    If getPdfPgCnt = 0 Then getPdfPgCnt = 1

End Function

Dim oFso, iFile, pgcnt, directory, base, docclass

directory="C:\PrintPDF\Input"
Set oFso = CreateObject("Scripting.FileSystemObject")
set base=oFso.getFolder(directory)
Set pgcnt = oFso.CreateTextFile("C:\PrintPDF\Results\pagecount.txt", True)

'enumerating pdf files in vbs's base directory
For Each iFile In base.Files
    If LCase(oFso.GetExtensionName(iFile)) = "pdf" Then pgcnt.WriteLine(iFile.name &","& getPdfDocClass(iFile) &","& getPdfPgCnt(iFile))
Next
Set oFso = Nothing
Während laut meinem Textfile (nur zum Testen) offensichtlich "Page" nicht nur gefunden, sondern auch richtig hochgezählt wird, wird der Begriff "Monthly" nicht gefunden und ich habe immer Baseline in der Ausgabe stehen.
Was läuft falsch?
Und wie bringe ich final die beiden Scripte in eins unter, so daß das Ganze in einem durchläuft?

Gruß
opiWahn
 
Zuletzt bearbeitet:

amn.ssy

Erfahrenes Mitglied
Hallo,

ziemlich doof von mir:
"CreateObject("Adodb.Stream")" streamt\ließt die PDF so ein, wie wenn man sie mit einem Editor öffnet. Zu sehen sind dann erstmal nur die codierten Daten und in Abständen eben "Type /Page" was den Seitenumbruch beschreibt. Daher kann ohne die PDF zuvor in Text zu konvertieren auch nicht gefunden werden.

Gruß
opiWahn