Necesito crear un documento de Word desde Delphi usando una plantilla determinada, guarde el documento como un documento de Word con un determinado nombre y, a continuación, guardar el mismo documento con el mismo nombre pero como un archivo PDF. (En Word 2007 se puede hacer uso de la SaveAsPdf… plugin. En Word 2010 es un construido en característica)

Cómo se puede hacer esto con Delphi XE?

  • Yo lo hago con vbscript. Que ayude a?
  • sin ánimo de ofender intención, sólo que para mí ha sido un largo tiempo desde que me fui de Delphi (con lágrimas de curso)y yo pensaba que debería ser el caso para todos.
  • Lo tienes ya? ¿Sabe usted cómo abrir un documento en Word? ¿Qué Palabra de la versión estará disponible en el cliente? Si es Word 2010 no debería ser muy difícil. Sólo uso COM para abrir el documento y guardarlo como pdf, lo que usted desea.
InformationsquelleAutor OZ8HP | 2011-12-06

2 Comentarios

  1. 6

    Primera importación «de Microsoft Word 12 Objetos» (MS Word 2007) tipo de biblioteca en el proyecto mediante el uso de Componentes | Importación de los Componentes del elemento de menú. A continuación, puede utilizar este código de ejemplo para cargar un archivo de MS Word y guardarlo como PDF a través del proceso interno de PDF converter. Si está utilizando Microsoft Word 2010, cargar su biblioteca de tipos en lugar de Word 2007.

    unit fMain;
    
    interface
    
    uses
      Windows, SysUtils, Variants, Classes, Controls, Forms, Dialogs, StdCtrls,
      Word_TLB;
    
    type
      TfrmMain = class(TForm)
        btnLoad: TButton;
        btnSaveAs: TButton;
        FileOpenDialog1: TFileOpenDialog;
        FileSaveDialog1: TFileSaveDialog;
        procedure btnLoadClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure btnSaveAsClick(Sender: TObject);
      private
        FWordApp : WordApplication;
        FWordDoc : WordDocument;
        procedure InitializeApp;
        procedure FinalizeApp;
        function LoadFile(const AFileName: string): WordDocument;
        procedure SaveAsPdf(ADocument: WordDocument; const AFileName: string);
      public
        { Public declarations }
      end;
    
    var
      frmMain: TfrmMain;
    
    implementation
    
    uses ComObj;
    
    {$R *.dfm}
    
    procedure TfrmMain.btnLoadClick(Sender: TObject);
    begin
      if FileOpenDialog1.Execute then
        FWordDoc := LoadFile(FileOpenDialog1.FileName);
    end;
    
    procedure TfrmMain.btnSaveAsClick(Sender: TObject);
    begin
      if FileSaveDialog1.Execute then
      begin
        if Assigned(FWordDoc) then
          SaveAsPdf(FWordDoc, FileSaveDialog1.FileName);
      end;
    end;
    
    procedure TfrmMain.FinalizeApp;
    var
      SaveChanges: OleVariant;
    begin
      if Assigned(FWordApp) then
      begin
        SaveChanges := False;
        FWordApp.Quit(SaveChanges, EmptyParam, EmptyParam);
        FWordApp := nil;
      end;
    end;
    
    procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      FinalizeApp;
    end;
    
    procedure TfrmMain.InitializeApp;
    begin
      FWordApp := createOleObject('Word.Application') as WordApplication;
      if Assigned(FWordApp) then
      begin
        FWordApp.Visible := False;
      end
      else
        raise Exception.Create('Cannot initialize Word application');
    end;
    
    function TfrmMain.LoadFile(const AFileName: string): WordDocument;
    var
      FileName: OleVariant;
      Doc : WordDocument;
    begin
      if not Assigned(FWordApp) then
        InitializeApp;
    
      FileName := AFileName;
      Doc := FWordApp.Documents.Open(FileName, EmptyParam, EmptyParam, EmptyParam,
                                     EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                     EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                     EmptyParam, EmptyParam, EmptyParam, EmptyParam);
      Result := Doc;
    end;
    
    procedure TfrmMain.SaveAsPdf(ADocument: WordDocument; const AFileName: string);
    var
      FileName,
      FileFormat : OleVariant;
    begin
      if Assigned(ADocument) then
      begin
        FileName := AFileName;
        FileFormat := wdFormatPDF;
        ADocument.SaveAs(FileName, FileFormat, EmptyParam, EmptyParam, EmptyParam,
                         EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                         EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                         EmptyParam);
      end;
    end;
    
    end.

    Acabo de escribir el código y funcionó una vez, funciona, pero no lo he probado a fondo, por lo que podría haber algunos problemas.

    • OP está pidiendo explícitamente para crear un nuevo documento de word utilizando una plantilla específica…?
    • Creo que se deja como ejercicio para el lector 🙂
    • Venema, lo tengo desde el título y la descripción era que él/ella tiene un problema con guardar el documento en un formato específico, no en la creación de un nuevo documento. He añadido LoadFile() para poder probar el código y asegurarse de que realmente convierte un determinado documento de MS Word a PDF.
    • Estoy de acuerdo en que la savetopdf parece importante, pero he leído el post como un llamado general para ayudar en la automatización de word; «crear» (en el título) no lee como «carga» y OP de la primera frase también es bastante explícito.
    • Voy a dar el código de un intento de mañana -es casi 2200 aquí 🙂 así que es hora de que algunos canales de TELEVISIÓN y una cama.
    • Venema, OP mencionado en la descripción que él podía resolver su problema en MS Word 2007, mediante SaveAsPlugin, así que mi conclusión fue que su principal problema era con guardar el documento como PDF. Si él también tiene un problema con la creación de un nuevo documento, que se puede hacer fácilmente llamando a FWordApp.Documentos.Método Add (), y si es necesario, puede editar la respuesta, y añadir esa parte también.
    • No se preocupe. Todos estamos de leer/interpretar las cosas de manera diferente. Lo cual es bueno ya que a menudo significa que al menos uno de nosotros», dice el OP de la mente» cuando las preguntas no son todo lo que está bien formulada. 🙂 (Y OP siempre se puede comentar, y pide más ayuda).
    • Tiene una versión editada que crea un doc con una plantilla específica? Si es así me gustaría verlo 🙂
    • no, acabo de escribir el código de arriba fuera de la banda, después de ver tu pregunta. Sin embargo, para crear un documento con una plantilla específica, puede utilizar FWordApp.Documentos.Agregar en lugar de FWordApp.Documentos.Método abierto. El primer parámetro que se envía al método Add es el nombre de la plantilla que desea utilizar, y para el resto de parámetros que puede utilizar EmptyParam. Aquí está el MSDN explicación sobre el método de adición: msdn.microsoft.com/en-us/library/…
    • OK – voy a darle una oportunidad
    • Me han llegado ahora un procedimiento para la creación de un documento utilizando una plantilla específica de trabajo – o allmost de trabajo Cuando el documento es creado y yo intente crear otra doc, tengo un «servidor RPC no disponible» error de omitir esto lo he hecho así que me guarde el doc y lo vuelva a abrir justo después de que el uso de ShellExecute – y entonces no hay ningún problema. (Me gustaría añadir mi código aquí, pero no he averiguado cómo)
    • si desea agregar aquí el código para pedir una solución para que un error de RPC, puedes editar tu pregunta, y añadir el nuevo código y una breve descripción de su problema actual que hay. Si el código está funcionando bien, y quieres compartirlo con los demás como una solución, haga clic en Añadir botón de Respuesta, y añadir el código como respuesta. Incluso puede seleccionar su propia respuesta como la aceptación de uno.

  2. 0

    Este código hace el truco para mí, pero como pueden ver tengo que guardar el doc a la vez y al volver a abrirlo utilizando ShellExecute. Si no puedo conseguir el «Servidor RPC no disponible» error he mencionado earlyer.

    procedure TfrmJobsearchAdverts.FileCreate;
    var
      TempName: OleVariant;
      FileDoc: OleVariant;
      FileFormat: OleVariant;
      Doc : WordDocument;
      WordTemplate: string;
      WordFile: string;
      BookName: OleVariant;
    begin
      SaveRecord;
      WordFile := Advert.CreateDocname(qryAdverts.FieldByName('fldadvert_date').AsDateTime);
      WordTemplate := JobsearchTemplate(Self);
      if (WordFile <> '') and (WordTemplate <> '') then
        begin
          Advert.SaveDocname(qryAdverts.FieldByName('fldadvert_guid').AsString, WordFile);
          if not Assigned(fWordApp) then
            InitializeWord;
          TempName := WordTemplate;
          FileDoc := WordFile;
          Doc := FWordApp.Documents.Add(TempName, EmptyParam, EmptyParam, EmptyParam);
          BookName := 'fldCompany';
          if Doc.Bookmarks.Exists(BookName) then
            Doc.Bookmarks.Item(BookName).Range.Text := Company.Name;
          BookName := 'fldAddress1';
          if Doc.Bookmarks.Exists(BookName) then
            Doc.Bookmarks.Item(BookName).Range.Text := Company.Address1;
          BookName := 'fldAddress2';
          if Doc.Bookmarks.Exists(BookName) then
            Doc.Bookmarks.Item(BookName).Range.Text := Company.Address2;
          BookName := 'fldZip';
          if Doc.Bookmarks.Exists(BookName) then
            Doc.Bookmarks.Item(BookName).Range.Text := Company.Zip;
          BookName := 'fldCity';
          if Doc.Bookmarks.Exists(BookName) then
            Doc.Bookmarks.Item(BookName).Range.Text := Company.City;
          FileFormat := wdFormatDocument;
          Doc.SaveAs(FileDoc, EmptyParam, EmptyParam, EmptyParam,
                     EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                     EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                     EmptyParam, EmptyParam, EmptyParam, EmptyParam);
          FinalizeWord;
          Files.ExecuteAndWait(WordFile);
        end;
    end;
    • Si usted necesita para crear y guardar varios documentos, usted no tiene que llamar a InitializeWord y FinializeWord para cada uno de ellos; sólo Inicializar la Palabra, y Finalizar de una vez cuando no se necesita el uso de la palabra más. Cuando termine de trabajar con un documento, cierre llamando a su método Close.

Dejar respuesta

Please enter your comment!
Please enter your name here