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