Convertendo o Powerpoint para soluções baseadas em servidor PDF?

0

Eu perguntei uma versão desta questão antes, mas estou precisando de outras soluções, então essa é uma questão mais objetiva.

Estou precisando de uma solução baseada em servidor para converter ppt arquivos em pdf arquivos.

Essa solução pode ser colocada no servidor da Web atual como um serviço acionado por comando do console, pode ser integrada ao código C # da Web, ou pode ser o próprio servidor.

Ele também não pode ser baseado no Libreoffice ou no OpenOffice, já que esses dois problemas têm a conversão do SmartArt. Atualmente estou usando o Libreoffice.

Eu testei os comandos do console do Powerpoint ( /pt ) combinados com um driver de impressão em PDF ( PDFCreator ), mas não consigo fazer isso funcionar em C #. A questão relacionada para esse problema é aqui

Eu tentei um script .vbs, mas isso abre brevemente a janela do powerpoint.

O script, de esta resposta , está aqui .

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

Outro método que eu tentei foi o seguinte: O problema é semelhante, ele abre uma janela (menor) brevemente.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            String sourceFilename = args[0];
            String destinationFileName = args[1];

            if (!File.Exists(sourceFilename))
            {
                throw new FileNotFoundException(string.Format("The specified file {0} does not exist.", sourceFilename), sourceFilename);
            }

            try
            {
                Microsoft.Office.Interop.PowerPoint.Application app = new Microsoft.Office.Interop.PowerPoint.Application();

                app.Presentations.Open(sourceFilename,Microsoft.Office.Core.MsoTriState.msoFalse,Microsoft.Office.Core.MsoTriState.msoFalse,Microsoft.Office.Core.MsoTriState.msoFalse).SaveAs(destinationFileName, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsPDF);
                app.Quit();
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("Unable to convert {0} to {1}", sourceFilename, destinationFileName), e);
            }
        }
    }
}
    
por Houseman 28.10.2013 / 22:46

1 resposta

1

Eu apenas tentei com um pequeno script vbs:

Dim oApp, Pres
Set oApp = CreateObject("Powerpoint.Application")
Set Pres = oApp.Presentations.Open("C:\temp\test.pptx", , , msoFalse)
Pres.SaveAs "c:\temp\test.pdf", 32, True
Pres.Close
oApp.Quit

E você está certo. Você não pode definir oApp.Visible = false . Para mim, a janela foi muito breve (quase não perceptível), mas com um ppt maior será mais longo. Então, se você realmente não quer o Powerpoint visível (mesmo que brevemente), você não pode usar a automação (via CreateObject ). (BTW porque é uma breve janela um problema se isso é criado em um servidor via web-servidor? Não há diálogo ou interação necessária.)

Em seguida, experimentei PDFCreator . (Faça desmarque as barras de ferramentas, etc ao instalar esta impressora PDF grátis, como acontece com todo o software.)

Com o botão direito do mouse e Create PDF with PDFCreator , a janela do PowerPoint não ficou visível. (nem brevemente)

Portanto, a execução do seguinte comando resultou em um test.pdf no meu diretório Documents ( silenciosamente ):

"C:\Program Files\Microsoft Office\Office12\POWERPNT.exe" /PT "PDFCreator" "" "" "C:\TEMP\test.pptx"

O equivalente vbs seria:

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.run """C:\Program Files\Microsoft Office\Office12\POWERPNT.exe"" /PT PDFCreator """" """" C:\TEMP\test.pptx"
Set objShell = Nothing

Assista a todos os duplos " s. Eles são todos necessários. Você não pode usar "" você precisa usar """" . (também em torno do programa.

Você precisa definir o PDFCreator para criar o arquivo sem diálogo (veja abaixo). O resultado será um arquivo (com o mesmo nome que o seu .pptx no diretório desejado.

BTW. Se esse arquivo for criado por um visitante da Web e o site for bastante visitado, talvez você queira criar previamente esses PDFs. (Não tenho certeza do que acontecerá se você iniciar o PowerPoint muitas vezes para imprimir)

    
por 29.10.2013 / 17:48