2011-12-06 44 views
4

特定のテンプレートを使用してWord文書を作成し、その文書を指定した名前のWord文書として保存し、同じ文書を同じ名前で保存する必要があります。しかし、PDFファイルとして。 (Word 2007では、SaveAsPdf ...プラグインを使用して行うことができます。Word 2010では組み込み機能です)DelphiからWord文書を作成し、DocおよびPDFとして保存

これはどのようにDelphi XEを使用して行うことができますか?

+0

私はそれをvbscriptで行います。助けてくれますか? –

+1

@TLamaは嫌な思いをしていません。私はDelphiを(涙で)残して以来、ずっとずっと時間がありました。 – Ali

+1

あなたはすでに何を持っていますか? Wordで文書を開く方法を知っていますか? クライアントで使用できるWordのバージョンは何ですか? Word 2010の場合は、それほど難しいものではありません。 COMを使用してドキュメントを開き、pdf形式で保存してください。 – Birger

答えて

6

最初に "Microsoft Word 12 Objects"(MS Word 2007)タイプライブラリをプロジェクトにコンポーネント|コンポーネントを使用してインポートします。コンポーネントのインポート]メニュー項目。次に、このサンプルコードを使用してMS Wordファイルをロードし、内部PDFコンバータを使用してPDFとして保存できます。あなたはMicrosoft Wordの2010を使用している場合は、

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. 

のWord 2007の代わりに、そのタイプライブラリをロード私は、コードを書き、それを一度走った、それは動作しますが、私は徹底的にそれをテストしていないので、いくつかあるかもしれません不具合

+0

OPは特定のテンプレートを使用して新しい単語文書を明示的に作成するよう求めています...? –

+1

私はそれが読者の練習として残されていると思います:-) – Birger

+0

@Marjan Venema、タイトルと説明から得たものは、文書を特定の形式で保存することに問題があり、新しい文書。コードをテストして、実際には特定のMS Word文書をPDFに変換するために、LoadFile()を追加しました。 – vcldeveloper

0

このコードは私のためのトリックですが、私はすぐに文書を保存し、ShellExecuteを使用して再度開く必要があります。そうでない場合は、私が早期に言及した 'RPCサーバーが利用できません'というエラーが表示されます。

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; 
+0

複数のドキュメントを作成して保存する必要がある場合は、それぞれにInitializeWordとFinializeWordを呼び出す必要はありません。単語を一度だけ初期化し、もうアプリケーションが必要ないときには一度確定します。ドキュメントを終了したら、Closeメソッドを呼び出してドキュメントを閉じます。 – vcldeveloper

関連する問題