2017-06-08 1 views
2

Je souhaite convertir un dossier contenant des fichiers PDF en fichiers XPS à l'aide de Powershell. En raison des restrictions du système, je suis incapable de télécharger un logiciel tiers tel que iTextSharp pour faire ce travail.Imprimer PDF en XPS avec Powershell

J'ai pu obtenir Powershell pour ouvrir le document et ouvrir la fenêtre d'impression pour XPS, mais le nom est toujours vide. Est-il possible que le nouveau nom de fichier corresponde au nom de fichier d'origine?

De même, comment le processus peut-il être automatisé afin que l'entrée de l'utilisateur ne soit pas nécessaire (par exemple, entrer le nom du fichier ou appuyer sur imprimer)? Enfin, est-il possible de changer le répertoire dans lequel il imprime?

Get-ChildItem -path $pdf_filepath -recurse -include *.pdf | ForEach-Object {Start-Process -FilePath $_.fullname -Verb Print -PassThru | %{sleep 10;$_} } 

Répondre

0

Voilà comment je le ferais:

#Define the directory containing your .pdf files 
$mydir="$env:USERPROFILE\Desktop\New folder" 
function print_files($mydir){ 
    #The purpose of this counter is to number your .xps files 
    Get-ChildItem $mydir -Filter *.pdf -Recurse | Foreach-Object { 
     #For each .pdf file in that directory, continue 
     same_time $_.FullName 
    } 
} 
#The following function keeps checking for a new window called "Save Print Output As". When the window shows up, it enters the name of the file and press ENTER. 
function enter_my_names($fullname){ 
    $wshell = New-Object -ComObject wscript.shell; 
    while($wshell.AppActivate('Save Print Output As') -ne $true){ 
     $wshell.AppActivate('Save Print Output As') 
    } 
    $basename = [io.path]::GetFileNameWithoutExtension($fullname) 
    #This is where the name is actually entered 
    $wshell.SendKeys("$basename") 
    $wshell.SendKeys("{ENTER}") 
} 
#The following function launches simultaneously a print job on the input file and a function waiting for the print job to show up to name the file. 
workflow same_time{ 
    Param(
     $fullname 
    ) 
    parallel{ 
     Start-Process -FilePath $fullname –Verb Print -PassThru 
     enter_my_names($fullname) 
    } 
} 
#MAIN PROGRAM 
#Here the script saves your current printer as default 
$defprinter = Get-WmiObject -Query "Select * from Win32_Printer Where Default=$true" 
#Queries for a XPS printer 
$printer = Get-WmiObject -Query "Select * from Win32_Printer Where Name='Microsoft XPS Document Writer'" 
#Sets the XPS printer as Default 
$printer.SetDefaultPrinter() 
#Starts the main job 
print_files($mydir) 
#Sets the old default printer back as default again 
$defprinter.SetDefaultPrinter() 
#This is a small delay to be sure everything is completed before closing Adobe Reader. You can probably shorten it a bit 
sleep 5 
#Finally, close Adobe Reader 
Get-Process "acrord32" | Stop-Process 

Cheers!

+0

La fonction print_files récupère les noms des fichiers dans le répertoire et stocke ces noms dans le dossier C: \ c pour une utilisation ultérieure. La fonction enter_my_names ouvre la fenêtre, rappelle le nom stocké dans C: \ c et imprime le fichier sous un nouveau nom. Le flux de travail appelle la fonction enter_my_names en parallèle afin de le rendre plus rapide. Enfin, print_files imprime les fichiers dans le répertoire désigné, puis supprime les informations inutiles de C: \ c. Est-ce que je l'ai décrit avec précision? Je rencontre des problèmes où les fichiers suivants tentent d'écraser parce que le nom ne change pas. – MrKGado

+0

@MrKGado J'ai modifié le script. Maintenant c'est définitivement mieux. Il est également commenté afin que vous puissiez mieux comprendre chaque section. Il faut installer Adobe Reader, espérons que ce n'est pas un problème majeur. Passez une bonne journée –

+0

C'est très utile, merci! Comment puis-je utiliser le Get-ChildItem pour collecter les noms de fichiers d'origine afin que les fichiers imprimés portent le même nom? J'ai essayé de modifier les lignes 6 et 8 avec les autres pièces de comptoir, mais j'ai fini par le casser à chaque fois. J'ai utilisé 'Get-ChildItem -Path $ mydir -Recurse -Name' pour rassembler les noms de fichiers, mais je n'ai pas réussi à trouver comment les lier au nom de sauvegarde d'impression. Des pensées? – MrKGado