Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как прочитать/изменить свойства Word документа?

01.01.2007
{ 1. Change MS Word properties via OLE } 
 
uses
 
ComObj;
 
procedure TForm1
.Button1Click(Sender: TObject);
const
  wdPropertyTitle
= $00000001;
  wdPropertySubject
= $00000002;
  wdPropertyAuthor
= $00000003;
  wdPropertyKeywords
= $00000004;
  wdPropertyComments
= $00000005;
  wdPropertyTemplate
= $00000006;
  wdPropertyLastAuthor
= $00000007;
  wdPropertyRevision
= $00000008;
  wdPropertyAppName
= $00000009;
  wdPropertyTimeLastPrinted
= $0000000A;
  wdPropertyTimeCreated
= $0000000B;
  wdPropertyTimeLastSaved
= $0000000C;
  wdPropertyVBATotalEdit
= $0000000D;
  wdPropertyPages
= $0000000E;
  wdPropertyWords
= $0000000F;
  wdPropertyCharacters
= $00000010;
  wdPropertySecurity
= $00000011;
  wdPropertyCategory
= $00000012;
  wdPropertyFormat
= $00000013;
  wdPropertyManager
= $00000014;
  wdPropertyCompany
= $00000015;
  wdPropertyBytes
= $00000016;
  wdPropertyLines
= $00000017;
  wdPropertyParas
= $00000018;
  wdPropertySlides
= $00000019;
  wdPropertyNotes
= $0000001A;
  wdPropertyHiddenSlides
= $0000001B;
  wdPropertyMMClips
= $0000001C;
  wdPropertyHyperlinkBase
= $0000001D;
  wdPropertyCharsWSpaces
= $0000001E;
const
 
AWordDoc = 'C:\Test.doc';
  wdSaveChanges
= $FFFFFFFF;
var
 
WordApp: OLEVariant;
 
SaveChanges: OleVariant;
begin
 
try
   
WordApp := CreateOleObject('Word.Application');
 
except
   
// Error....
   
Exit;
 
end;
 
try
   
WordApp.Visible := False;
   
WordApp.Documents.Open(AWordDoc);
   
WordApp.ActiveDocument.BuiltInDocumentProperties[wdPropertyTitle].Value := 'Your Title...';
   
WordApp.ActiveDocument.BuiltInDocumentProperties[wdPropertySubject].Value := 'Your Subject...';
   
// ...
   
// ...
 
finally
   
SaveChanges := wdSaveChanges;
   
WordApp.Quit(SaveChanges, EmptyParam, EmptyParam);
 
end;
end;
{ 
 
2. Read MS Word properties via Structured Storage.
 
by Serhiy Perevoznyk
}
uses
 
ComObj, ActiveX;
 
const
  FmtID_SummaryInformation
: TGUID =
   
'{F29F85E0-4FF9-1068-AB91-08002B27B3D9}';
 
function FileTimeToDateTimeStr(F: TFileTime): string;
var
 
LocalFileTime: TFileTime;
 
SystemTime: TSystemTime;
 
DateTime: TDateTime;
begin
 
if Comp(F) = 0 then Result := '-'
 
else  
 
begin
   
FileTimeToLocalFileTime(F, LocalFileTime);
   
FileTimeToSystemTime(LocalFileTime, SystemTime);
   
with SystemTime do
     
DateTime := EncodeDate(wYear, wMonth, wDay) +
       
EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
   
Result := DateTimeToStr(DateTime);
 
end;
end;
 
function GetDocInfo(const FileName: WideString): string;
var
  I
: Integer;
 
PropSetStg: IPropertySetStorage;
 
PropSpec: array[2..19] of TPropSpec;
 
PropStg: IPropertyStorage;
 
PropVariant: array[2..19] of TPropVariant;
 
Rslt: HResult;
  S
: string;
 
Stg: IStorage;
begin
 
Result := '';
 
try
   
OleCheck(StgOpenStorage(PWideChar(FileName), nil, STGM_READ or
      STGM_SHARE_DENY_WRITE
,
     
nil, 0, Stg));
   
PropSetStg := Stg as IPropertySetStorage;
   
OleCheck(PropSetStg.Open(FmtID_SummaryInformation,
      STGM_READ
or STGM_SHARE_EXCLUSIVE, PropStg));
   
for I := 2 to 19 do
   
begin
     
PropSpec[I].ulKind := PRSPEC_PROPID;
     
PropSpec[I].PropID := I;
   
end;
   
Rslt := PropStg.ReadMultiple(18, @PropSpec, @PropVariant);
   
OleCheck(Rslt);
   
if Rslt <> S_FALSE then for I := 2 to 19 do
     
begin
        S
:= '';
       
if PropVariant[I].vt = VT_LPSTR then
         
if Assigned(PropVariant[I].pszVal) then
            S
:= PropVariant[I].pszVal;
       
case I of
         
2:  S  := Format('Title: %s', [S]);
         
3:  S  := Format('Subject: %s', [S]);
         
4:  S  := Format('Author: %s', [S]);
         
5:  S  := Format('Keywords: %s', [S]);
         
6:  S  := Format('Comments: %s', [S]);
         
7:  S  := Format('Template: %s', [S]);
         
8:  S  := Format('Last saved by: %s', [S]);
         
9:  S  := Format('Revision number: %s', [S]);
         
10: S := Format('Total editing time: %g sec',
             
[Comp(PropVariant[I].filetime) / 1.0E9]);
         
11: S := Format('Last printed: %s',
             
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
         
12: S := Format('Create time/date: %s',
             
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
         
13: S := Format('Last saved time/date: %s',
             
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
         
14: S := Format('Number of pages: %d', [PropVariant[I].lVal]);
         
15: S := Format('Number of words: %d', [PropVariant[I].lVal]);
         
16: S := Format('Number of characters: %d',
             
[PropVariant[I].lVal]);
         
17:; // thumbnail
         
18: S := Format('Name of creating application: %s', [S]);
         
19: S := Format('Security: %.8x', [PropVariant[I].lVal]);
       
end;
       
if S <> '' then Result := Result + S + #13;
     
end;
 
finally
 
end;
end;
 
procedure TForm1
.Button1Click(Sender: TObject);
begin
 
if Opendialog1.Execute then
   
ShowMessage(GetDocInfo(opendialog1.FileName));
end;

Взято с сайта https://www.swissdelphicenter.ch/en/tipsindex.php