gang13
Goto Top

Pdfs je nach Größe an unterschiedliche Drucker senden

Hallo zusammen,

ich bin auf meiner Suche im Internet auf dieses Forum gestoßen, vielleicht könnt ihr mir ja weiterhelfen ...

Ich habe folgendes Problem:
In einem Ordner liegen einige pdf-Dateien, die in unterschiedlichen Papierformaten abgespeichert sind.
Ich möchte diese pdf's automatisch in A4 bzw. A3 drucken.
Mein "Batch" sollte jede pdf nach der Reihe "untersuchen", welches Papierformat (Größe) in den Eigenschaften eingetragen ist.
Je nachdem welche Größe erkannt wurde (A4-> auf A4 Drucker. A3,A2,A1,A0 -> auf A3 Drucker), sollten diese Dateien an den richtigen Drucker gesendet werden.

Ich habe im Internet gesucht und bin u.a. auf "PDF Papierformat ermitteln (per Batch)" gestoßen.
Die pdfinfo.exe habe ich mir bereits heruntergeladen.
Ebenso bin ich auf ein Batch gestoßen, mit dem man alle Dokumente in einem Ordner drucken kann, allerdings nur mit dem Standarddrucker.

Kann mir von euch jemand weiterhelfen?
Ich arbeite mit Win7 (64)
Ich bin ziemlicher Anfänger im Batch- und Programmierbereich ...

Freundliche Grüße, ein verzweifelter PC-User face-wink

Content-Key: 288834

Url: https://administrator.de/contentid/288834

Printed on: April 18, 2024 at 03:04 o'clock

Member: colinardo
Solution colinardo Nov 19, 2015, updated at Jan 04, 2016 at 10:16:57 (UTC)
Goto Top
Hallo Gang13, Willkommen auf Administrator.de!
Das gewünschte könntest du z.B. mit folgendem Powershell-Script erledigen. Die Variablen die anzupassen sind stehen in den ersten kommentierten Zeilen.

Das Skript nimmt alle PDF Dateien (*.pdf) eines Ordners, extrahiert mit der pdfinfo.exe die Seitengröße der Dateien, Gruppiert dann die Dateien nach <=A4 und >A4 und schickt diese Dateien dann an den entsprechend angegebenen Drucker. (Zur Info: Die Dateien werden mit der Default-App welche für PDF-Dateien auf dem OS eingetragen ist gedruckt, es sollte also eine solche eingerichtet sein, z.B. Adobe Reader/Acrobat). Nach Verarbeitung werden die Dateien in einen Ablage-Ordner verschoben.
# Pfad zur pdfinfo.exe
$pdfinfo = 'D:\Tools\pdfinfo.exe'  
# Ordner der die PDFs enthält
$source = 'D:\Quelle'  
# Ordner in den die PDFs nach dem Druck verschoben werden
$target = "D:\Ziel"  
# A4 Printer
$printerA4 = "HP Officejet A4"  
# A3 Printer
$printerA3 = "HP Officejet A3"  

# ============================

# Funktion die die Seitengrößen des PDFs ausliest
function Add-PageSize(){
    param(
        [parameter(mandatory=$true,ValueFromPipeline=$true)]$fileItem
    )
    process{
        if ($fileItem.Extension -eq '.pdf'){  
            try{
                $sizes = [regex]::Match((& $pdfinfo $fileItem.FullName | out-string),'(?im)^Page size:\s*([\d\.]*) x ([\d\.]*)')  
                $width = [int]([double]$sizes.Groups[1].Value * 0.352778)
                $height = [int]([double]$sizes.Groups[2].Value * 0.352778)
                $fileItem | Add-Member -MemberType NoteProperty -Name 'Seitenbreite' -Value $width  
                $fileItem | Add-Member -MemberType NoteProperty -Name 'Seitenhöhe' -Value $height  
            }catch{}
        }
        $fileitem
    }
}

# Druckfunktion
function Print-PDF {
    param(
        [parameter(mandatory=$true,ValueFromPipelineByPropertyName=$true)][Alias("Fullname")][ValidateNotNullOrEmpty()][string[]]$files,  
        [ValidateScript({(gwmi Win32_Printer -Filter "Name='$_'")})][string]$printer,  
        [parameter(ParameterSetname="A")][switch]$DeleteAfterPrint,  
        [parameter(ParameterSetname="B")][switch]$MovePDF,  
        [parameter(Mandatory=$true,ParameterSetname="B")][ValidateScript({Test-Path $_})]$Destination  
    )
    begin{
        # set printer
        if ($printer -ne ''){  
            # store original printer
            $originalPrinter = gwmi Win32_Printer -Filter "Default='true'"  
            # set default printer temporarily to defined printer
            [void](gwmi Win32_Printer -Filter "Name='$printer'").SetDefaultPrinter()  
        }

        # function to check file lock state
        $CheckFileStatus = {
            param([string]$filePath)
            try{
                $fileStream = (New-Object System.IO.FileInfo $filePath).OpenWrite()
                $fileStream.Close(); $fileStream.Dispose()
                # file is not locked by another process
                return $true
            }catch{
                # file is locked
                return $false
            }
        }
        $pdfAppID = $null
    }
    
    process{
        $files | %{
            write-host "Printing document: '$_' ..." -ForegroundColor Green  
            # start printing pdf with default print-handler in the system
            $pdfApp = (start-process $_ -Verb "print" -PassThru).ProcessName  
            # sleep time  / increase this parameter in case files get not printed
            sleep(3)
            # check file-lock-status in loop until it's free 
            while(!(&$CheckFileStatus $_)){sleep(1)}
            # delete file if desired by user
            if ($DeleteAfterPrint.IsPresent){    
                write-host "Deleting document: '$_' ..." -ForegroundColor Yellow  
                del $_ -Force
            }
            if ($MovePDF.IsPresent){    
                write-host "Moving document '$_' to : '$Destination' ..." -ForegroundColor Yellow  
                move-item $_ -Destination $Destination -Force
            }
        }
    }
    end{
        # kill pdf viewer process
        get-process $pdfApp -EA SilentlyContinue | Stop-Process

        if ($printer -ne ''){  
            #restore original default printer
            [void]$originalPrinter.SetDefaultPrinter()
        }
    }
}

# Seiteninfos extrahieren und nach <=A4 und >A4 gruppieren
$pagegroups = gci $source | Add-PageSize -ErrorAction SilentlyContinue | group {($_.Seitenbreite * $_.Seitenhöhe) -le 62370}

# Seiten an A4 Drucker senden 
$pagegroups | ?{$_.Name -eq $true} | select -Expand Group | Print-PDF -printer $printerA4 -MovePDF -Destination $target
# Seiten an A3 Drucker senden
$pagegroups | ?{$_.Name -eq $false} | select -Expand Group | Print-PDF -printer $printerA3 -MovePDF -Destination $target
Bitte habe Verständnis das wir hier nicht jedem einen Anfänger-Kurs in Powershell geben können, dazu gibt es genügend Tutorials im Netz.

Für weiteren Support zum Skript stehe ich gerne zur Verfügung . Dieser ist dann jedoch kostenpflichtig.
Bei Interesse kannst du mich dann gerne via PM kontaktieren.

Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Member: Gang13
Gang13 Nov 20, 2015 at 06:12:56 (UTC)
Goto Top
Hallo Uwe,

vielen Dank erstmal für deine Antwort.

Ich werde mir das Ganze mal ansehen und dann ggf. auf dich zurückkommen.

Freundliche Grüße
Mitglied: 114757
114757 Nov 20, 2015 updated at 13:55:06 (UTC)
Goto Top
Moin @colinardo(Uwe),
find ich echt gut das Skript, läuft hier wie Schmidts Katze! Danke dafür, kann ich bei einem Kunden gut gebrauchen.
Eine Spende ist unterwegs, denn das hat mir einige Programmierarbeit erspart face-smile

VIELEN DANK!!

Schönes Wochenende
Gruß jodel32
Member: colinardo
colinardo Nov 20, 2015 updated at 15:45:47 (UTC)
Goto Top
Zitat von @114757:
Eine Spende ist unterwegs, denn das hat mir einige Programmierarbeit erspart face-smile
Ein herzliches Dankschön face-big-smile
VIELEN DANK!!
Keine Ursache.
Schönes Wochenende
Wünsche ich ebenso face-smile
Member: colinardo
colinardo Dec 30, 2015 at 18:52:44 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.

Guten Rutsch