2017-06-08 65 views
2

Powershellを使用してPDFファイルを含むフォルダをXPSファイルに変換したいと思います。システムの制限により、iTextSharpのようなサードパーティのソフトウェアをダウンロードすることができません。Powershellを使用してPDFをXPSに出力

私はPowershellにドキュメントを開いてXPSの印刷ウィンドウを開くことができましたが、名前は常に空白です。新しいファイル名を元のファイル名と一致させることは可能ですか?

また、プロセスを自動化することで、ユーザー入力が不要になります(つまり、ファイル名を入力する、または印刷するなど)。最後に、印刷するディレクトリを変更することは可能ですか?

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

答えて

0

これは、私はそれを行うだろうかです:

#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 

乾杯!

+0

print_files関数は、ディレクトリ内のファイルの名前を取得し、後で使用するためにこれらの名前をC:\ cフォルダに格納します。 enter_my_names関数はウィンドウを開き、C:\ cに格納されている名前を呼び出して新しい名前でファイルを出力します。 ワークフローでは、enter_my_names関数が並列実行され、より高速に実行されます。 最後に、print_filesは実際に指定されたディレクトリにファイルを出力し、C:\ cから不要な情報を削除します。 私はそれを正確に記述しましたか?名前が変更されていないため、後続のファイルが上書きしようとする問題が発生しています。 – MrKGado

+0

@MrKGadoスクリプトを修正しました。今それは間違いなく良いです。また、各セクションをよりよく理解できるようにコメントしています。 Adobe Readerをインストールする必要がありますが、それが大きな問題ではないことを願っています。素敵な一日を。 –

+0

これはとても役に立ちます、ありがとう! Get-ChildItemを使用して元のファイル名を収集して、印刷されたファイルの名前が同じになるようにするにはどうすればよいですか?私は6行目と8行目を他の$カウンタと一緒に修正しようとしましたが、毎回それを打ち破ってしまいました。私は 'Get-ChildItem -Path $ mydir -Recurse -Name'を使ってファイル名を集めましたが、それらを印刷保存名にリンクする方法を見つけることができませんでした。何かご意見は? – MrKGado

関連する問題