特定のテンプレートを使用してWord文書を作成し、その文書を指定した名前のWord文書として保存し、同じ文書を同じ名前で保存する必要があります。しかし、PDFファイルとして。 (Word 2007では、SaveAsPdf ...プラグインを使用して行うことができます。Word 2010では組み込み機能です)DelphiからWord文書を作成し、DocおよびPDFとして保存
これはどのようにDelphi XEを使用して行うことができますか?
特定のテンプレートを使用してWord文書を作成し、その文書を指定した名前のWord文書として保存し、同じ文書を同じ名前で保存する必要があります。しかし、PDFファイルとして。 (Word 2007では、SaveAsPdf ...プラグインを使用して行うことができます。Word 2010では組み込み機能です)DelphiからWord文書を作成し、DocおよびPDFとして保存
これはどのようにDelphi XEを使用して行うことができますか?
最初に "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の代わりに、そのタイプライブラリをロード私は、コードを書き、それを一度走った、それは動作しますが、私は徹底的にそれをテストしていないので、いくつかあるかもしれません不具合
OPは特定のテンプレートを使用して新しい単語文書を明示的に作成するよう求めています...? –
私はそれが読者の練習として残されていると思います:-) – Birger
@Marjan Venema、タイトルと説明から得たものは、文書を特定の形式で保存することに問題があり、新しい文書。コードをテストして、実際には特定のMS Word文書をPDFに変換するために、LoadFile()を追加しました。 – vcldeveloper
このコードは私のためのトリックですが、私はすぐに文書を保存し、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;
複数のドキュメントを作成して保存する必要がある場合は、それぞれにInitializeWordとFinializeWordを呼び出す必要はありません。単語を一度だけ初期化し、もうアプリケーションが必要ないときには一度確定します。ドキュメントを終了したら、Closeメソッドを呼び出してドキュメントを閉じます。 – vcldeveloper
私はそれをvbscriptで行います。助けてくれますか? –
@TLamaは嫌な思いをしていません。私はDelphiを(涙で)残して以来、ずっとずっと時間がありました。 – Ali
あなたはすでに何を持っていますか? Wordで文書を開く方法を知っていますか? クライアントで使用できるWordのバージョンは何ですか? Word 2010の場合は、それほど難しいものではありません。 COMを使用してドキュメントを開き、pdf形式で保存してください。 – Birger