unit UMakeDoc;

{$MODE Delphi}

interface

uses
  LCLIntf, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  PReport, ComCtrls, ExtCtrls, Menus, PRAnnotation, PdfDoc, PdfTypes,
  LResources;

type
  TContentsElement = class;

  { TForm1 }

  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    CreatePDF1: TMenuItem;
    N1: TMenuItem;
    Exit1: TMenuItem;
    Help1: TMenuItem;
    About1: TMenuItem;
    PReport1: TPReport;
    PRText93: TPRText;
    SaveDialog1: TSaveDialog;
    Panel1: TPanel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    TabSheet6: TTabSheet;
    TabSheet7: TTabSheet;
    TabSheet8: TTabSheet;
    TabSheet9: TTabSheet;
    TabSheet10: TTabSheet;
    TabSheet11: TTabSheet;
    TabSheet12: TTabSheet;
    TabSheet13: TTabSheet;
    TabSheet14: TTabSheet;
    TabSheet15: TTabSheet;
    TabSheet16: TTabSheet;
    TabSheet17: TTabSheet;
    CoverPage: TPRPage;
    PRLayoutPanel1: TPRLayoutPanel;
    PRText2: TPRText;
    PRLayoutPanel2: TPRLayoutPanel;
    PRText1: TPRText;
    ContentsPage: TPRPage;
    PRLayoutPanel4: TPRLayoutPanel;
    PRRect6: TPRRect;
    PRRect7: TPRRect;
    PRRect8: TPRRect;
    PRRect10: TPRRect;
    PRText1Contents: TPRText;
    PRPage3: TPRPage;
    PRLayoutPanel3: TPRLayoutPanel;
    PRRect1: TPRRect;
    PRRect2: TPRRect;
    PRRect3: TPRRect;
    PRText6: TPRText;
    PRRect4: TPRRect;
    PRTextIntro: TPRText;
    PRRect5: TPRRect;
    PRText1_1: TPRText;
    PRText9: TPRText;
    PRText1_2: TPRText;
    PRText259: TPRText;
    PRText1_3: TPRText;
    PRText261: TPRText;
    PRText262: TPRText;
    PRText263: TPRText;
    PRPage4: TPRPage;
    PRLayoutPanel5: TPRLayoutPanel;
    PRRect9: TPRRect;
    PRRect11: TPRRect;
    PRRect12: TPRRect;
    PRRect13: TPRRect;
    PRText21: TPRText;
    PRRect14: TPRRect;
    PRTextCompRef: TPRText;
    PRText2_1: TPRText;
    PRText24: TPRText;
    PRText2_1_1: TPRText;
    PRText26: TPRText;
    PRText27: TPRText;
    PRText28: TPRText;
    PRText29: TPRText;
    PRText30: TPRText;
    PRText31: TPRText;
    PRText32: TPRText;
    PRText36: TPRText;
    PRText37: TPRText;
    PRText38: TPRText;
    PRText39: TPRText;
    PRText40: TPRText;
    PRText41: TPRText;
    PRText42: TPRText;
    PRText43: TPRText;
    PRText44: TPRText;
    PRText45: TPRText;
    PRText46: TPRText;
    PRText47: TPRText;
    PRText48: TPRText;
    PRText49: TPRText;
    PRText50: TPRText;
    PRText33: TPRText;
    PRText34: TPRText;
    PRText35: TPRText;
    PRText83: TPRText;
    PRText84: TPRText;
    PRText85: TPRText;
    PRPage5: TPRPage;
    PRLayoutPanel6: TPRLayoutPanel;
    PRRect15: TPRRect;
    PRRect16: TPRRect;
    PRRect17: TPRRect;
    PRRect18: TPRRect;
    PRText62: TPRText;
    PRText63: TPRText;
    PRText64: TPRText;
    PRText53: TPRText;
    PRText54: TPRText;
    PRText55: TPRText;
    PRText56: TPRText;
    PRText58: TPRText;
    PRText59: TPRText;
    PRText60: TPRText;
    PRText61: TPRText;
    PRText65: TPRText;
    PRText66: TPRText;
    PRText67: TPRText;
    PRText86: TPRText;
    PRText87: TPRText;
    PRText88: TPRText;
    PRText77: TPRText;
    PRText78: TPRText;
    PRText79: TPRText;
    PRPage7: TPRPage;
    PRLayoutPanel7: TPRLayoutPanel;
    PRRect19: TPRRect;
    PRRect20: TPRRect;
    PRRect21: TPRRect;
    PRRect22: TPRRect;
    PRText2_2_1: TPRText;
    PRText102: TPRText;
    PRText103: TPRText;
    PRText104: TPRText;
    PRText105: TPRText;
    PRText106: TPRText;
    PRText107: TPRText;
    PRText108: TPRText;
    PRText109: TPRText;
    PRText110: TPRText;
    PRText111: TPRText;
    PRText112: TPRText;
    PRText113: TPRText;
    PRText114: TPRText;
    PRText115: TPRText;
    PRText2_2_2: TPRText;
    PRText96: TPRText;
    PRText97: TPRText;
    PRText119: TPRText;
    PRText120: TPRText;
    PRText121: TPRText;
    PRText122: TPRText;
    PRText123: TPRText;
    PRText124: TPRText;
    PRText125: TPRText;
    PRText2_2: TPRText;
    PRText90: TPRText;
    PRText91: TPRText;
    PRText92: TPRText;
    PRPage8: TPRPage;
    PRLayoutPanel8: TPRLayoutPanel;
    PRRect23: TPRRect;
    PRRect24: TPRRect;
    PRRect25: TPRRect;
    PRRect26: TPRRect;
    PRText2_3: TPRText;
    PRText152: TPRText;
    PRText153: TPRText;
    PRText154: TPRText;
    PRText155: TPRText;
    PRText156: TPRText;
    PRText2_3_1: TPRText;
    PRText164: TPRText;
    PRText165: TPRText;
    PRText166: TPRText;
    PRText2_3_2: TPRText;
    PRText100: TPRText;
    PRText101: TPRText;
    PRText116: TPRText;
    PRText117: TPRText;
    PRText118: TPRText;
    PRText126: TPRText;
    PRText127: TPRText;
    PRPage9: TPRPage;
    PRLayoutPanel9: TPRLayoutPanel;
    PRRect27: TPRRect;
    PRRect28: TPRRect;
    PRRect29: TPRRect;
    PRRect30: TPRRect;
    PRText2_4: TPRText;
    PRText133: TPRText;
    PRText134: TPRText;
    PRText135: TPRText;
    PRText136: TPRText;
    PRText137: TPRText;
    PRText2_4_1: TPRText;
    PRText139: TPRText;
    PRText140: TPRText;
    PRText141: TPRText;
    PRText2_4_2: TPRText;
    PRText143: TPRText;
    PRText144: TPRText;
    PRText145: TPRText;
    PRText146: TPRText;
    PRText147: TPRText;
    PRText148: TPRText;
    PRText149: TPRText;
    PRText150: TPRText;
    PRText157: TPRText;
    PRText158: TPRText;
    PRText159: TPRText;
    PRText160: TPRText;
    PRText161: TPRText;
    PRText162: TPRText;
    PRText167: TPRText;
    PRText168: TPRText;
    PRText169: TPRText;
    PRText170: TPRText;
    PRText171: TPRText;
    PRText172: TPRText;
    PRText173: TPRText;
    PRText174: TPRText;
    PRText175: TPRText;
    PRPage10: TPRPage;
    PRLayoutPanel17: TPRLayoutPanel;
    PRRect67: TPRRect;
    PRRect68: TPRRect;
    PRRect69: TPRRect;
    PRRect70: TPRRect;
    PRText2_5: TPRText;
    PRText281: TPRText;
    PRText287: TPRText;
    PRText319: TPRText;
    PRText320: TPRText;
    PRText321: TPRText;
    PRText2_5_1: TPRText;
    PRText323: TPRText;
    PRText324: TPRText;
    PRText325: TPRText;
    PRText326: TPRText;
    PRText327: TPRText;
    PRText328: TPRText;
    PRText329: TPRText;
    PRText330: TPRText;
    PRText331: TPRText;
    PRText348: TPRText;
    PRText349: TPRText;
    PRText350: TPRText;
    PRText354: TPRText;
    PRText355: TPRText;
    PRText356: TPRText;
    PRPage11: TPRPage;
    PRLayoutPanel14: TPRLayoutPanel;
    PRRect54: TPRRect;
    PRRect55: TPRRect;
    PRRect56: TPRRect;
    PRRect58: TPRRect;
    PRText380: TPRText;
    PRText381: TPRText;
    PRText382: TPRText;
    PRText383: TPRText;
    PRText384: TPRText;
    PRText385: TPRText;
    PRText386: TPRText;
    PRText387: TPRText;
    PRText388: TPRText;
    PRText389: TPRText;
    PRRect76: TPRRect;
    PRText390: TPRText;
    PRText391: TPRText;
    PRText392: TPRText;
    PRText393: TPRText;
    PRText394: TPRText;
    PRText395: TPRText;
    PRPage12: TPRPage;
    PRLayoutPanel10: TPRLayoutPanel;
    PRRect31: TPRRect;
    PRRect32: TPRRect;
    PRRect33: TPRRect;
    PRRect34: TPRRect;
    PRText2_6: TPRText;
    PRText179: TPRText;
    PRText180: TPRText;
    PRText181: TPRText;
    PRText182: TPRText;
    PRText183: TPRText;
    PRText2_6_1: TPRText;
    PRText185: TPRText;
    PRText186: TPRText;
    PRText187: TPRText;
    PRText196: TPRText;
    PRText197: TPRText;
    PRText198: TPRText;
    PRText199: TPRText;
    PRText200: TPRText;
    PRText201: TPRText;
    PRText202: TPRText;
    PRText203: TPRText;
    PRText239: TPRText;
    PRText295: TPRText;
    PRText296: TPRText;
    PRText297: TPRText;
    PRText298: TPRText;
    PRText299: TPRText;
    PRText300: TPRText;
    PRText301: TPRText;
    PRText302: TPRText;
    PRText303: TPRText;
    PRText304: TPRText;
    PRText305: TPRText;
    PRText306: TPRText;
    PRText307: TPRText;
    PRText308: TPRText;
    PRText309: TPRText;
    PRText310: TPRText;
    PRText311: TPRText;
    PRText312: TPRText;
    PRPage13: TPRPage;
    PRLayoutPanel11: TPRLayoutPanel;
    PRRect35: TPRRect;
    PRRect36: TPRRect;
    PRRect37: TPRRect;
    PRRect38: TPRRect;
    PRText2_7: TPRText;
    PRText191: TPRText;
    PRText192: TPRText;
    PRText193: TPRText;
    PRText194: TPRText;
    PRText195: TPRText;
    PRText2_7_1: TPRText;
    PRText206: TPRText;
    PRText207: TPRText;
    PRText208: TPRText;
    PRText209: TPRText;
    PRText210: TPRText;
    PRText211: TPRText;
    PRText212: TPRText;
    PRText213: TPRText;
    PRText214: TPRText;
    PRText215: TPRText;
    PRText216: TPRText;
    PRText217: TPRText;
    PRText3: TPRText;
    PRText204: TPRText;
    PRText240: TPRText;
    PRPage14: TPRPage;
    PRLayoutPanel12: TPRLayoutPanel;
    PRRect39: TPRRect;
    PRRect40: TPRRect;
    PRRect41: TPRRect;
    PRRect42: TPRRect;
    PRText2_8: TPRText;
    PRText246: TPRText;
    PRText247: TPRText;
    PRText248: TPRText;
    PRText249: TPRText;
    PRText250: TPRText;
    PRText2_8_1: TPRText;
    PRText252: TPRText;
    PRText253: TPRText;
    PRText254: TPRText;
    PRText255: TPRText;
    PRText256: TPRText;
    PRText257: TPRText;
    PRText258: TPRText;
    PRText260: TPRText;
    PRText264: TPRText;
    PRText265: TPRText;
    PRText273: TPRText;
    PRText274: TPRText;
    PRPage15: TPRPage;
    PRLayoutPanel13: TPRLayoutPanel;
    PRRect43: TPRRect;
    PRRect44: TPRRect;
    PRRect45: TPRRect;
    PRRect46: TPRRect;
    PRText2_9: TPRText;
    PRText221: TPRText;
    PRText222: TPRText;
    PRText223: TPRText;
    PRText2_9_1: TPRText;
    PRText227: TPRText;
    PRText228: TPRText;
    PRText229: TPRText;
    PRText230: TPRText;
    PRText231: TPRText;
    PRText232: TPRText;
    PRText233: TPRText;
    PRText234: TPRText;
    PRText235: TPRText;
    PRText236: TPRText;
    PRText237: TPRText;
    PRText238: TPRText;
    PRRect47: TPRRect;
    PRText224: TPRText;
    PRText225: TPRText;
    PRRect48: TPRRect;
    PRText266: TPRText;
    PRRect49: TPRRect;
    PRRect50: TPRRect;
    PRText267: TPRText;
    PRText268: TPRText;
    PRRect51: TPRRect;
    PRRect52: TPRRect;
    PRText269: TPRText;
    PRText270: TPRText;
    PRRect57: TPRRect;
    PRPage16: TPRPage;
    PRLayoutPanel18: TPRLayoutPanel;
    PRRect72: TPRRect;
    PRRect73: TPRRect;
    PRRect74: TPRRect;
    PRRect75: TPRRect;
    PRText2_10: TPRText;
    PRText357: TPRText;
    PRText358: TPRText;
    PRText359: TPRText;
    PRText2_10_1: TPRText;
    PRText361: TPRText;
    PRText362: TPRText;
    PRText363: TPRText;
    PRText364: TPRText;
    PRText365: TPRText;
    PRText366: TPRText;
    PRText367: TPRText;
    PRText368: TPRText;
    PRText369: TPRText;
    PRText370: TPRText;
    PRText371: TPRText;
    PRText372: TPRText;
    PRLabel2: TPRLabel;
    PRRect53: TPRRect;
    PREllipse1: TPREllipse;
    PREllipse2: TPREllipse;
    PREllipse3: TPREllipse;
    PREllipse4: TPREllipse;
    PREllipse5: TPREllipse;
    PREllipse6: TPREllipse;
    PRPage17: TPRPage;
    PRLayoutPanel16: TPRLayoutPanel;
    PRRect63: TPRRect;
    PRRect64: TPRRect;
    PRRect65: TPRRect;
    PRRect66: TPRRect;
    PRText2_11: TPRText;
    PRText282: TPRText;
    PRText283: TPRText;
    PRText284: TPRText;
    PRText2_11_1: TPRText;
    PRText291: TPRText;
    PRText292: TPRText;
    PRText293: TPRText;
    PRText294: TPRText;
    PRText313: TPRText;
    PRText314: TPRText;
    PRText315: TPRText;
    PRText316: TPRText;
    PRAnnotation1: TPRAnnotation;
    PRAnnotation2: TPRAnnotation;
    PRText288: TPRText;
    PRText289: TPRText;
    PRText290: TPRText;
    PRText317: TPRText;
    PRText318: TPRText;
    PRPage20: TPRPage;
    PRLayoutPanel15: TPRLayoutPanel;
    PRRect59: TPRRect;
    PRRect60: TPRRect;
    PRRect61: TPRRect;
    PRRect62: TPRRect;
    PRText220: TPRText;
    PRTextCopyright: TPRText;
    PRLabel3: TPRLabel;
    PRLabel4: TPRLabel;
    PRLabel6: TPRLabel;
    PRLabel7: TPRLabel;
    PRLabel9: TPRLabel;
    PRLabel5: TPRLabel;
    PRLabel8: TPRLabel;
    PRLabel10: TPRLabel;
    PRRect71: TPRRect;
    PRLabel11: TPRLabel;
    PRLabel1: TPRLabel;
    PRLabel22: TPRLabel;
    PRLabel23: TPRLabel;
    PRLabel24: TPRLabel;
    PRLabel25: TPRLabel;
    PRLabel26: TPRLabel;
    PRLabel27: TPRLabel;
    PRLabel28: TPRLabel;
    PRLabel29: TPRLabel;
    PRLabel30: TPRLabel;
    PRLabel31: TPRLabel;
    PRLabel32: TPRLabel;
    PRLabel33: TPRLabel;
    PRLabel34: TPRLabel;
    PRLabel35: TPRLabel;
    PRLabel36: TPRLabel;
    PRLabel21: TPRLabel;
    PRGridPanel1: TPRGridPanel;
    lblSectionNo: TPRLabel;
    lblSectionName: TPRLabel;
    PRText5: TPRText;
    PRText7: TPRText;
    PRText8: TPRText;
    PRText10: TPRText;
    PRText11: TPRText;
    TabSheet18: TTabSheet;
    PRPage6: TPRPage;
    PRLayoutPanel19: TPRLayoutPanel;
    PRRect77: TPRRect;
    PRRect78: TPRRect;
    PRRect79: TPRRect;
    PRRect80: TPRRect;
    PRText94: TPRText;
    PRText95: TPRText;
    PRText98: TPRText;
    PRText99: TPRText;
    PRText128: TPRText;
    PRText129: TPRText;
    PRText130: TPRText;
    PRText131: TPRText;
    PRText132: TPRText;
    PRText138: TPRText;
    PRText176: TPRText;
    PRText177: TPRText;
    PRText178: TPRText;
    PRLabel12: TPRLabel;
    PRLabel13: TPRLabel;
    PRLabel14: TPRLabel;
    PRLabel15: TPRLabel;
    PRText4: TPRText;
    PRText13: TPRText;
    PRLabel16: TPRLabel;
    PRLabel17: TPRLabel;
    TabSheet19: TTabSheet;
    PRPage18: TPRPage;
    PRLayoutPanel20: TPRLayoutPanel;
    PRRect81: TPRRect;
    PRRect82: TPRRect;
    PRRect83: TPRRect;
    PRRect84: TPRRect;
    PRLabel18: TPRLabel;
    PRText2_12: TPRText;
    PRText14: TPRText;
    PRText15: TPRText;
    PRText16: TPRText;
    PRText2_12_2: TPRText;
    TabSheet20: TTabSheet;
    PRPage19: TPRPage;
    PRLayoutPanel21: TPRLayoutPanel;
    PRRect85: TPRRect;
    PRRect86: TPRRect;
    PRRect87: TPRRect;
    PRRect88: TPRRect;
    PRLabel19: TPRLabel;
    PRText70: TPRText;
    PRText71: TPRText;
    PRText72: TPRText;
    PRText73: TPRText;
    PRText74: TPRText;
    PRText12: TPRText;
    PRText17: TPRText;
    PRLabel20: TPRLabel;
    PRLabel37: TPRLabel;
    PRText188: TPRText;
    PRText189: TPRText;
    PRLabel38: TPRLabel;
    PRLabel39: TPRLabel;
    PRText190: TPRText;
    PRText219: TPRText;
    PRLabel40: TPRLabel;
    PRLabel41: TPRLabel;
    PRLabel42: TPRLabel;
    PRLabel43: TPRLabel;
    PRText18: TPRText;
    PRLabel44: TPRLabel;
    PRLabel45: TPRLabel;
    PRText19: TPRText;
    PRLabel46: TPRLabel;
    PRLabel47: TPRLabel;
    PRText20: TPRText;
    PRLabel48: TPRLabel;
    PRLabel49: TPRLabel;
    PRText22: TPRText;
    PRLabel50: TPRLabel;
    PRLabel51: TPRLabel;
    PRText23: TPRText;
    PRLabel52: TPRLabel;
    PRLabel53: TPRLabel;
    PRText25: TPRText;
    PRLabel54: TPRLabel;
    PRLabel55: TPRLabel;
    PRText51: TPRText;
    PRLabel56: TPRLabel;
    PRLabel57: TPRLabel;
    PRText52: TPRText;
    PRText57: TPRText;
    PRLabel58: TPRLabel;
    PRLabel59: TPRLabel;
    PRText68: TPRText;
    PRText69: TPRText;
    PRText75: TPRText;
    PRLabel60: TPRLabel;
    PRLabel61: TPRLabel;
    PRLabel62: TPRLabel;
    PRLabel63: TPRLabel;
    PRLabel64: TPRLabel;
    PRLabel65: TPRLabel;
    PRLabel66: TPRLabel;
    PRLabel67: TPRLabel;
    PRLabel68: TPRLabel;
    PRLabel69: TPRLabel;
    PRText76: TPRText;
    PRText80: TPRText;
    PRText81: TPRText;
    PRText82: TPRText;
    PRText89: TPRText;
    PRLabel70: TPRLabel;
    PRLabel71: TPRLabel;
    procedure PRLayoutPanel2BeforePrint(Sender: TObject;
      ACanvas: TPRCanvas; Rect: TRect);
    procedure PRLayoutPanel2AfterPrint(Sender: TObject;
      ACanvas: TPRCanvas; Rect: TRect);
    procedure CreatePDF1Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure About1Click(Sender: TObject);
    procedure PRLayoutPanelBeforePrint(Sender: TObject;
      ACanvas: TPRCanvas; Rect: TRect);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PRGridPanel1BeforePrintChild(Sender: TObject;
      ACanvas: TPRCanvas; ACol, ARow: Integer; Rect: TRect);
    procedure CoverPagePrintPage(Sender: TObject; ACanvas: TPRCanvas);
    procedure PageControl1Change(Sender: TObject);
  private
    FCurrentOutline: array[0..5] of TPROutlineEntry;
    FContentsList: TList;
    FPos: integer;
    procedure CreateContentsList;
    function FindLink(AItem: TPRItem): TContentsElement;
  public
    { Public �錾 }
  end;

  TContentsElement = class(TObject)
  private
    FContentsIndex: string;
    FTitle: string;
    FData: TPdfDictionary;
    FTarget: TPRItem;
  public
    property ContentsIndex: string read FContentsIndex write FContentsIndex;
    property Title: string read FTitle write FTitle;
    property Data: TPdfDictionary read FData write FData;
    property Target: TPRItem read FTarget write FTarget;
  end;

var
  Form1: TForm1;

implementation


procedure TForm1.PRLayoutPanel2BeforePrint(Sender: TObject;
  ACanvas: TPRCanvas; Rect: TRect);
begin
  // change the horizontal scaling of th font.
  ACanvas.SetHorizontalScaling(80);
  PRLayoutPanelBeforePrint(Sender, ACanvas, Rect);
end;

procedure TForm1.PRLayoutPanel2AfterPrint(Sender: TObject;
  ACanvas: TPRCanvas; Rect: TRect);
begin
  // restore the horizontal scaling of th font.
  ACanvas.SetHorizontalScaling(100);
end;

procedure TForm1.CreateContentsList;
var
  APage: TPRPage;
  APanel: TPRPanel;
  AControl: TControl;
  i, j, k: integer;
  FChapterIndex: integer;
  FContentsElement: TContentsElement;
  S: string;
begin
  // clear the contents list.
  for i := FContentsList.Count - 1 downto 0 do
    TContentsElement(FContentsList.Items[i]).Free;

  // create new contents list.
  FChapterIndex := 0;
  for i := 0 to PageControl1.PageCount do
  begin
    APage := TPRPage(Self.FindComponent('PRPage' + IntToStr(i)));
    if (APage <> nil) and (APage.Controls[0] is TPRPanel) then
    begin
      APanel := TPRPanel(APage.Controls[0]);
      for j := 0 to APanel.ControlCount - 1 do
      begin
        AControl := APanel.Controls[j];
        if AControl.Tag = 2 then
        begin
          FContentsElement := TContentsElement.Create;
          with FContentsElement do
          begin
            if AControl is TPRText then
              Title := TPRText(AControl).Text
            else
            if AControl is TPRLabel then
              Title := TPRLabel(AControl).Caption
            else
              raise Exception.CreateFmt('invalid target control %s', [AControl.ClassName]);
            if (Title <> 'Contents') and (Title <> 'Copyright') then
            begin
              inc(FChapterIndex);
              FContentsList.Add(TContentsElement.Create);
              Title := 'Chapter' + IntToStr(FChapterIndex) + ' ' + Title;
              Target := TPRItem(AControl);
              FContentsList.Add(FContentsElement);
            end
            else
              FContentsElement.Free;
          end;
        end
        else
        if (AControl.Tag = 3) or (AControl.Tag = 4) then
        begin
          FContentsElement := TContentsElement.Create;
          with FContentsElement do
          begin
            if AControl is TPRText then
              S := TPRText(AControl).Text
            else
            if AControl is TPRLabel then
              S := TPRLabel(AControl).Caption
            else
              raise Exception.CreateFmt('invalid target control %s', [AControl.ClassName]);
            k := Pos(' ', S);
            if k < 1 then
              raise Exception.CreateFmt('invalid contents title text %s', [S]);
            ContentsIndex := Copy(S, 1, k);
            Title := Trim(Copy(S, k, Length(S) - k + 1));
            Target := TPRItem(AControl);
          end;
          FContentsList.Add(FContentsElement);
        end;
      end;
    end;
  end;
end;

procedure TForm1.CreatePDF1Click(Sender: TObject);
var
  APage: TPRPage;
  i: integer;
begin
  if not SaveDialog1.Execute then Exit;
  with PReport1 do
  begin
    FileName := SaveDialog1.FileName;
    BeginDoc;

    FCurrentOutline[0] := OutlineRoot;
    OutlineRoot.Opened := true;
    Print(CoverPage);

    CreateContentsList;

    // print index of contents.
    FPos := 0;
    while FPos < FContentsList.Count do
    begin
      Print(ContentsPage);
      PRText1Contents.Text := '';
      PRText1Contents.Tag := 0;
    end;

    for i := 2 to PageControl1.PageCount - 1 do
    begin
      APage := TPRPage(PageControl1.Pages[i].Controls[0]);
      if APage <> nil then
        Print(APage);
    end;
    EndDoc;

    for i := FContentsList.Count - 1 downto 0 do
      TContentsElement(FContentsList.Items[i]).Free;
    FContentsList.Clear;
  end;
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.About1Click(Sender: TObject);
begin
  ShowMessage(POWER_PDF_VERSION_STR + #13#10 + POWER_PDF_COPYRIGHT);
end;

procedure TForm1.PRLayoutPanelBeforePrint(Sender: TObject;
  ACanvas: TPRCanvas; Rect: TRect);
var
  FDestination: TPRDestination;
  i, j: integer;
  FLevel: integer;
  FControlList: TList;
  FPRText: TPRText;
  TmpYPos: integer;
  ItemIndex: integer;
  FTextWidth: Single;
  Element: TContentsElement;
begin
  // printting page number
  if PReport1.PageNumber > 1 then
    with ACanvas do
    begin
      SetFont('Times-Roman', 8);
      FTextWidth := TextWidth(IntToStr(PReport1.PageNumber - 1));
      TextOut((PageWidth - FTextWidth) / 2 + 3, 30, IntToStr(PReport1.PageNumber - 1));
    end;

  // sorting the Items of the page by Top property.
  FControlList := TList.Create;
  with (Sender as TPRPanel) do
  for i := 0 to ControlCount - 1 do
    if (Controls[i] is TPRText) and (Controls[i].Tag > 0) then
    begin
      TmpYPos := Controls[i].Top;
      ItemIndex := -1;
      for j := 0 to FControlList.Count - 1 do
        if TControl(FControlList[j]).Top > TmpYPos then
        begin
          ItemIndex := j;
          Break;
        end;
      if ItemIndex = -1 then
        FControlList.Add(Controls[i])
      else
        FControlList.Insert(ItemIndex, Controls[i]);
    end;

  for i := 0 to FControlList.Count - 1 do
    if TPRText(FControlList[i]).Tag > 0 then
    begin
      // getting outline level from the Tag property.
      FPRText := TPRText(FControlList[i]);
      FLevel := FPRText.Tag;
      if FCurrentOutline[FLevel - 1] <> nil then
      begin
        FCurrentOutline[FLevel] := FCurrentOutline[FLevel - 1].AddChild;
        with FCurrentOutline[FLevel] do
        begin
          if FLevel = 1 then
            Opened := true;
          Title := FPRText.Text;
          FDestination := PReport1.CreateDestination;
          Dest := FDestination;
        end;
        with FDestination do
        begin
          DestinationType := dtXYZ;
          Top := FPRText.Top;
          Left := FPRText.Left;
          Zoom := 0;
        end;

        // setting the destination object to the link-annotation.
        Element := FindLink(TPRText(FControlList[i]));
        if Element <> nil then
          Element.Data.AddItem('Dest', FDestination.Data.GetValue);
      end;
    end;

  FControlList.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FContentsList := TList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := FContentsList.Count - 1 downto 0 do
    TContentsElement(FContentsList.Items[i]).Free;
  FContentsList.Free;
end;

procedure TForm1.PRGridPanel1BeforePrintChild(Sender: TObject;
  ACanvas: TPRCanvas; ACol, ARow: Integer; Rect: TRect);
begin
  if FPos < FContentsList.Count then
  with TContentsElement(FContentsList[FPos]) do
    begin
      if ContentsIndex = '' then
      begin
        lblSectionName.FontBold := true;
        lblSectionNo.FontSize := 12;
        lblSectionName.FontSize := 12;
        lblSectionName.Top := 0;
      end
      else
      begin
        lblSectionName.FontBold := false;
        lblSectionNo.FontSize := 11;
        lblSectionName.FontSize := 11;
        lblSectionNo.Top := 3;
        lblSectionName.Top := 3;
      end;
      lblSectionNo.Caption := ContentsIndex;
      lblSectionName.Caption := Title;
      with Rect do
        Data := ACanvas.PdfCanvas.Doc.CreateAnnotation(asLink,
            _PdfRect(Left, ACanvas.PageHeight - Top, Right, ACanvas.PageHeight - Bottom));
      with Data do
        AddItem('Border', TPdfArray.CreateNumArray(nil, [0, 0, 0]));
    end
  else
  begin
    lblSectionNo.Caption := '';
    lblSectionName.Caption := '';
  end;
  inc(FPos);
end;

procedure TForm1.CoverPagePrintPage(Sender: TObject; ACanvas: TPRCanvas);
begin
  with PReport1 do
  begin
    OpenAction := CreateDestination;
    OpenAction.DestinationType := dtXYZ;
  end;
end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin

end;

function TForm1.FindLink(AItem: TPRItem): TContentsElement;
var
  i: integer;
  Element: TContentsElement;
begin
  result := nil;
  for i := FContentsList.Count - 1 downto 0 do
  begin
    Element := TContentsElement(FContentsList.Items[i]);
    if Element.Target = AItem then result := Element;
  end;
end;

initialization
  {$i UMakeDoc.lrs}

end.