題 如何自動將PowerPoint轉換為PDF?


我需要使用第三方產品通過命令行將.ppt / .pptx文件轉換為.pdf文件(或圖像)。

我將它用於Windows 2008服務器,我不能使用任何GUI或網站,因為這需要一個自動化過程。

我嘗試過libreoffice,但它在轉換智能藝術方面存在問題。

編輯:我的最終解決方案是使用 powerpoint與C#互操作。 也可以看看: https://stackoverflow.com/questions/26372020/how-to-programmatically-create-a-powerpoint-from-a-list-of-images


4
2017-09-05 15:51


起源


你用的是什麼操作系統?您需要使用命令行轉換它們的任何特定原因? - Gryphoenix
@Gryphoenix Windows server 2008.它需要是一個我可以用代碼調用的自動化過程。這就是為什麼。 - Houseman
看起來沒有通過命令行進行此轉換的本機功能,但有許多第三方產品具有此功能。 - Gryphoenix
您是否考慮過使用MS Office 2010和自動化的副本(通過您的代碼)?產品推薦偏離主題。 - Ƭᴇcʜιᴇ007
看看這篇文章: superuser.com/questions/614992/... - Josh


答案:


不需要第三方產品。如您所知,PowerPoint可以將演示文稿導出為PDF。通過應用一點腳本,您可以實現您的結果。我在下面編寫了VB腳本。只需創建一個名稱以“.vbs”結尾的文件,粘貼下面的代碼即可。

使用:

 CSCRIPT ppt.vbs "input file name" "output file name"

重要的是要注意:

  • 如果名稱包含空格,則需要引用它們。
  • 如果您沒有為輸出文件指定路徑,PowerPoint將把它放入 您的文檔文件夾。

我已經包含內聯鏈接以引用各種位。

Option Explicit

Sub WriteLine ( strLine )
    WScript.Stdout.WriteLine strLine
End Sub

' http://msdn.microsoft.com/en-us/library/office/aa432714(v=office.12).aspx
Const msoFalse = 0   ' False.
Const msoTrue = -1   ' True.

' http://msdn.microsoft.com/en-us/library/office/bb265636(v=office.12).aspx
Const ppFixedFormatIntentScreen = 1 ' Intent is to view exported file on screen.
Const ppFixedFormatIntentPrint = 2  ' Intent is to print exported file.

' http://msdn.microsoft.com/en-us/library/office/ff746754.aspx
Const ppFixedFormatTypeXPS = 1  ' XPS format
Const ppFixedFormatTypePDF = 2  ' PDF format

' http://msdn.microsoft.com/en-us/library/office/ff744564.aspx
Const ppPrintHandoutVerticalFirst = 1   ' Slides are ordered vertically, with the first slide in the upper-left corner and the second slide below it.
Const ppPrintHandoutHorizontalFirst = 2 ' Slides are ordered horizontally, with the first slide in the upper-left corner and the second slide to the right of it.

' http://msdn.microsoft.com/en-us/library/office/ff744185.aspx
Const ppPrintOutputSlides = 1               ' Slides
Const ppPrintOutputTwoSlideHandouts = 2     ' Two Slide Handouts
Const ppPrintOutputThreeSlideHandouts = 3   ' Three Slide Handouts
Const ppPrintOutputSixSlideHandouts = 4     ' Six Slide Handouts
Const ppPrintOutputNotesPages = 5           ' Notes Pages
Const ppPrintOutputOutline = 6              ' Outline
Const ppPrintOutputBuildSlides = 7          ' Build Slides
Const ppPrintOutputFourSlideHandouts = 8    ' Four Slide Handouts
Const ppPrintOutputNineSlideHandouts = 9    ' Nine Slide Handouts
Const ppPrintOutputOneSlideHandouts = 10    ' Single Slide Handouts

' http://msdn.microsoft.com/en-us/library/office/ff745585.aspx
Const ppPrintAll = 1            ' Print all slides in the presentation.
Const ppPrintSelection = 2      ' Print a selection of slides.
Const ppPrintCurrent = 3        ' Print the current slide from the presentation.
Const ppPrintSlideRange = 4     ' Print a range of slides.
Const ppPrintNamedSlideShow = 5 ' Print a named slideshow.

' http://msdn.microsoft.com/en-us/library/office/ff744228.aspx
Const ppShowAll = 1             ' Show all.
Const ppShowNamedSlideShow = 3  ' Show named slideshow.
Const ppShowSlideRange = 2      ' Show slide range.

'
' This is the actual script
'

Dim inputFile
Dim outputFile
Dim objPPT
Dim objPresentation
Dim objPrintOptions
Dim objFso

If WScript.Arguments.Count <> 2 Then
    WriteLine "You need to specify input and output files."
    WScript.Quit
End If

inputFile = WScript.Arguments(0)
outputFile = WScript.Arguments(1)

Set objFso = CreateObject("Scripting.FileSystemObject")

If Not objFso.FileExists( inputFile ) Then
    WriteLine "Unable to find your input file " & inputFile
    WScript.Quit
End If

If objFso.FileExists( outputFile ) Then
    WriteLine "Your output file (' & outputFile & ') already exists!"
    WScript.Quit
End If

WriteLine "Input File:  " & inputFile
WriteLine "Output File: " & outputFile

Set objPPT = CreateObject( "PowerPoint.Application" )

objPPT.Visible = True
objPPT.Presentations.Open inputFile

Set objPresentation = objPPT.ActivePresentation
Set objPrintOptions = objPresentation.PrintOptions

objPrintOptions.Ranges.Add 1,objPresentation.Slides.Count
objPrintOptions.RangeType = ppShowAll

' Reference for this at http://msdn.microsoft.com/en-us/library/office/ff746080.aspx
objPresentation.ExportAsFixedFormat outputFile, ppFixedFormatTypePDF, ppFixedFormatIntentScreen, msoTrue, ppPrintHandoutHorizontalFirst, ppPrintOutputSlides, msoFalse, objPrintOptions.Ranges(1), ppPrintAll, "Slideshow Name", False, False, False, False, False

objPresentation.Close
ObjPPT.Quit

7
2017-09-06 00:47



謝謝。我正準備寫這樣的東西,除了在C#中。唯一的缺點是,Powerpoint窗口彈出一兩秒鐘。我嘗試過設置 objPPT.Visible 至 False,但它錯了,並告訴我,這是不允許的。 - Houseman
此過程將在服務器上完成。我想,每次必須轉換文件時實際打開PowerPoint都會非常耗費資源。有沒有辦法不這樣做? - Houseman
@Houseman您可以通過修改腳本來避免重複啟動和關閉PowerPoint,但每個文件都需要打開和關閉。 - iBug
有可能適應這個用詞嗎? - Marcel


您可以打印到Adobe Distiller等PDF打印機驅動程序,或任何更便宜甚至更多的開源驅動程序。


3
2017-09-05 16:11



Adobe Distiller官方頁面沒有提及將powerpoint文件轉換為.pdf的信息。 - Houseman
它是一個打印驅動程序,您可以打印的任何內容都可以製作成PDF格式。 - Rod MacPherson
如何實際運行PowerPoint以自動方式打印到Adobe Distiller打印驅動程序? - Sun
使用命令行中的/ pt選項打印並指定哪台打印機。 officeone.mvps.org/pptfaq/ppt_cmdline.html  在distiller中設置文檔默認值應該會超過打印選項GUI彈出窗口。 - Rod MacPherson
@OWiz因為你有PDFCreator已經讓我們專注於它。我不打算推​​荐一個驅動程序而不是另一個驅動程序,所以讓我們繼續你所擁有的。嘗試在GUI模式下將某些內容打印到PDF創建者。彈出後,進入“選項”菜單,然後啟用自動保存。保存設置並從命令行嘗試一下。 - Rod MacPherson


Office PowerPoint Viewer 2007 有一個命令行開關 /p 這將允許您將PowerPoint文件打印到默認打印機。

例如:

Send the presentation to a printer, and print the file.

Example: "c:\program files\microsoft office\office12\PPTVIEW.exe" /P "Presentation.pptx"

This example prints the Presentation.pptx file.

PDF打印機可能必須設置為默認打印機。

而不是Adobe Distiller,這意味著你必須購買Adobe Acrobat,我建議你使用 的PDFCreator。它是免費的,如果您調整選項,可以自動保存輸出文件。這樣,您可以使用完全命令行方法將PowerPoint文件轉換為PDF,而無需向Microsoft或Adobe進行額外付款。


2
2017-09-05 16:45



我嘗試了這個,但它打開了一個GUI對話框,而不是默默地遵循命令。我做錯了嗎? - Houseman
或許/ p只會使您進入打印對話框,因為未選擇和處理默認打印機。您可以嘗試/查看PowerPoint等效項是否適用於PowerPoint Viewer。這將是一種解決方法,但您也可以創建一個AutoHotKey宏,以便在進入GUI提示時單擊“打印”。其他你可以購買PowerPoint並使用/ pt參數,我覺得在你的情況下效果更好。 - Sun
我試過用了 /pt PowerPoint的選項,但沒有任何反應。可能是因為它將pdfCreator打印機視為實際的物理打印機。它不是打印到文件,這是我想要的。 - Houseman
我知道PowerPoint可以選擇將其保存為.pdf,這就是我想要的,但我不能用命令行做到這一點 - Houseman
您可能還想探索運行宏的/ M參數。該宏可以調用VBA腳本,該腳本可以使用內置的PowerPoint函數將PowerPoint保存為PDF。這是一個例子: vbadud.blogspot.com/2012/05/... - Sun


用這個來編寫一個轉換整個文件夾的腳本,請回復一下這是否可以改進這是我第一次寫vbscript!

命令:

cscript scriptname.vbs "C:/path/to/folder"

文件將保存在腳本所在的目錄中。

碼:

Option Explicit

Sub WriteLine ( strLine )
    WScript.Stdout.WriteLine strLine
End Sub

Const msoFalse = 0   ' False.
Const msoTrue = -1   ' True.

Const ppFixedFormatIntentScreen = 1 ' Intent is to view exported file on screen.
Const ppFixedFormatIntentPrint = 2  ' Intent is to print exported file.

Const ppFixedFormatTypeXPS = 1  ' XPS format
Const ppFixedFormatTypePDF = 2  ' PDF format

Const ppPrintHandoutVerticalFirst = 1   ' Slides are ordered vertically, with the first slide in the upper-left corner and the second slide below it.
Const ppPrintHandoutHorizontalFirst = 2 ' Slides are ordered horizontally, with the first slide in the upper-left corner and the second slide to the right of it.

Const ppPrintOutputSlides = 1               ' Slides
Const ppPrintOutputTwoSlideHandouts = 2     ' Two Slide Handouts
Const ppPrintOutputThreeSlideHandouts = 3   ' Three Slide Handouts
Const ppPrintOutputSixSlideHandouts = 4     ' Six Slide Handouts
Const ppPrintOutputNotesPages = 5           ' Notes Pages
Const ppPrintOutputOutline = 6              ' Outline
Const ppPrintOutputBuildSlides = 7          ' Build Slides
Const ppPrintOutputFourSlideHandouts = 8    ' Four Slide Handouts
Const ppPrintOutputNineSlideHandouts = 9    ' Nine Slide Handouts
Const ppPrintOutputOneSlideHandouts = 10    ' Single Slide Handouts

Const ppPrintAll = 1            ' Print all slides in the presentation.
Const ppPrintSelection = 2      ' Print a selection of slides.
Const ppPrintCurrent = 3        ' Print the current slide from the presentation.
Const ppPrintSlideRange = 4     ' Print a range of slides.
Const ppPrintNamedSlideShow = 5 ' Print a named slideshow.

Const ppShowAll = 1             ' Show all.
Const ppShowNamedSlideShow = 3  ' Show named slideshow.
Const ppShowSlideRange = 2      ' Show slide range.

'
' This is the actual script
'

Dim inputDirectory
Dim inputFolder
Dim inFiles
Dim outputFolder
Dim inputFile
Dim outputFile
Dim curFile
Dim objPPT
Dim objPresentation
Dim objPrintOptions
Dim objFso
Dim curDir



If WScript.Arguments.Count <> 1 Then
    WriteLine "You need to specify input files."
    WScript.Quit
End If

Set objFso = CreateObject("Scripting.FileSystemObject")

curDir = objFso.GetAbsolutePathName(".")

Set inputFolder = objFSO.GetFolder(WScript.Arguments.Item(0))
Set outputFolder = objFSO.GetFolder(WScript.Arguments.Item(0)) 

Set inFiles = inputFolder.Files

Set objPPT = CreateObject( "PowerPoint.Application" )

For Each curFile in inFiles

Set inputFile = curFile

If Not objFso.FileExists( inputFile ) Then
    WriteLine "Unable to find your input file " & inputFile
    WScript.Quit
End If

objPPT.Visible = TRUE
objPPT.Presentations.Open inputFile

Set objPresentation = objPPT.ActivePresentation
Set objPrintOptions = objPresentation.PrintOptions

objPrintOptions.Ranges.Add 1,objPresentation.Slides.Count
objPrintOptions.RangeType = ppShowAll

objPresentation.ExportAsFixedFormat curDir & curFile.Name & ".pdf", ppFixedFormatTypePDF, ppFixedFormatIntentScreen, msoTrue, ppPrintHandoutHorizontalFirst, ppPrintOutputSlides, msoFalse, objPrintOptions.Ranges(1), ppPrintAll, "Slideshow Name", False, False, False, False, False

objPresentation.Close

Next

ObjPPT.Quit

2
2018-04-02 16:23



如果您的代碼是對BillP3rd答案的修改,那麼最好引用它(參見 chitu.okoli.org/psyche/it/how-to-cite-code)。此外,我不確定為什麼你刪除BillP3rd引用他自己的消息來源的評論。 - Ochado
大多數工作,雖然它仍然是我的情況下文件夾名稱的文件(我使用“。”作為輸入文件夾)。 - Ochado