2011-03-30 27 views

Respuesta

3

Lo hago con el siguiente script .vbs. Si lo necesita en el código de Delphi, entonces sería bastante fácil de convertir:

Const wdDoNotSaveChanges = 0 
Const wdRevisionsViewFinal = 0 
Const wdFormatPDF = 17 

Dim arguments 
Set arguments = WScript.Arguments 

Function DOC2PDF(sDocFile) 

    Dim fso ' As FileSystemObject 
    Dim wdo ' As Word.Application 
    Dim wdoc ' As Word.Document 
    Dim wdocs ' As Word.Documents 

    Set fso = CreateObject("Scripting.FileSystemObject") 
    sDocFile = fso.GetAbsolutePathName(sDocFile) 
    sPdfFile = fso.GetParentFolderName(sDocFile) + "\" + fso.GetBaseName(sDocFile) + ".pdf" 

    Set wdo = CreateObject("Word.Application") 
    Set wdocs = wdo.Documents 
    WScript.Echo "Opening: " + sDocFile 
    Set wdoc = wdocs.Open(sDocFile) 
    if fso.FileExists(sPdfFile) Then 
    fso.DeleteFile sPdfFile, True 
    End If 
    WScript.Echo "Converting to PDF: " + sPdfFile 
    Set wview = wdoc.ActiveWindow.View 
    wview.ShowRevisionsAndComments = False 
    wview.RevisionsView = wdRevisionsViewFinal 
    wdoc.SaveAs sPdfFile, wdFormatPDF 
    WScript.Echo "Conversion completed" 
    wdo.Quit wdDoNotSaveChanges 

    Set fso = Nothing 
    Set wdo = Nothing 

End Function 

If arguments.Count=1 Then 
    Call DOC2PDF(arguments.Unnamed.Item(0)) 
Else 
    WScript.Echo "Generates a PDF file from a Word document using Word PDF export." 
    WScript.Echo "" 
    WScript.Echo "Usage: doc2pdf.vbs <doc-file>" 
    WScript.Echo "" 
End If 
+0

Elijo esto como respuesta porque contiene 'wdDoNotSaveChanges' que me ha ayudado mucho. Perdí 1 día y luego volví a leer esta pregunta. Sin usar esa palabra, se pide ahorrar y es muy molesto. – LaBracca

8

He no tan lejos, pero no debería ser difícil:

Aquí está un esqueleto básico:

uses 
    ComObj; 
const 
    wdExportFormatPDF = 17; 
var 
    Word, Doc: OleVariant; 
begin 
    Word := CreateOLEObject('Word.Application'); 
    Doc := Word.Documents.Open('C:\Document.docx'); 
    Doc.ExportAsFixedFormat('C:\Document.pdf', wdExportFormatPDF); 
end; 

Tenga en cuenta que he declare, tanto los Word y Doc variables como OleVariants, de modo que sea versión indepent (es decir, este código funcionará ya sea que esté utilizando Word 2007 o 2010). También puede usar las bibliotecas de componentes de VCL Office si lo desea. Si tuviera que procesar mucho en el documento, definitivamente sería más rápido.

+1

Ok, esto funciona (acabo de reemplazar OleAuto con ComObj ya que entiendo que OleAuto está en desuso). ¿Podría decirme dónde encontrar las bibliotecas de componentes de VCL Office? Recuerdo haberlas visto en Delphi 7 Palette, pero no las veo en 2009. – LaBracca

+0

@ user193655: Me parece recordar que era una opción separada en el instalador, pero no puedo estar seguro. No los tengo en mi configuración D2010 tampoco (pero casi siempre uso variantes de todos modos, para ser más flexible, utilizo el navegador de objetos de VBA para descubrir los objetos y métodos a usar) – Martijn