⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vpdfdoc.pas

📁 生成PDF文档的控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{*******************************************************}
{                                                       }
{       This unit is part of the VISPDF VCL library.    }
{       Written by R.Husske - ALL RIGHTS RESERVED.      }
{                                                       }
{       Copyright (C) 2000-2009, www.vispdf.com         }
{                                                       }
{       e-mail: support@vispdf.com                      }
{       http://www.vispdf.com                           }
{                                                       }
{*******************************************************}

unit VPDFDoc;

interface

{$I VisPDFLib.inc }

uses
  Windows, SysUtils, Classes, Graphics, Math, Jpeg, ShellApi, VPDFTypes,
  VPDFObjects, VPDFZLib, VPDFBarcode, VPDFFonts, VPDFCrypt;

type
  TVPDFJustificationType = (jtLeft, jtCenter, jtRight);

  TVPDFTSh = record
    AValText: AnsiString;
    AValX: Single;
  end;

  TVPDFCurrPoint = record
    X: Extended;
    Y: Extended;
  end;

  TVPDFRect = record
    Left, Top, Right, Bottom: Extended;
  end;

  TVPDFParagraph = record
    Justification: TVPDFJustificationType;
    Indention: Single;
    LeftMargin: Single;
    RightMargin: Single;
    TopMargin: Single;
    BottomMargin: Single;
  end;

  TGenByteArray = array[0..9] of byte;
  TGenerationArray = array[0..9] of Integer;

  TVPDFImageObject = record
    Index: Integer;
    Name: AnsiString;
    ImageObject: TVPDFObject;
    Width: Integer;
    Height: Integer;
  end;

  XRefItem = record
    Loaded: boolean;
    Offset: Integer;
    ObjNumber: TVPDFObjectNumber;
  end;

  TVPDFKeyType = (k40, k128, aes128);
  TPDFVersType = (pdf10, pdf11, pdf12, pdf13, pdf14, pdf15, pdf16, pdf17, pdf18, pdf19, pdf110);
  TVPDFActionScriptType = (astOpen, astClose, astWillSave, astDidSave, astWillPrint, astDidPrint);
  TVPDFCompressionMethod = (cmNone, cmFlateDecode);
{$IFDEF BCB}
  TVPDFPageOrientation = (vpoPortrait, vpoLandscape);
{$ELSE}
  TVPDFPageOrientation = (poPortrait, poLandscape);
{$ENDIF}
  TLineCapStyle = (lcButtEnd, lcRoundEnd, lcProjectSquareEnd);
  TLineJoinStyle = (ljMiterJoin, ljRoundJoin, ljBevelJoin);
  TPDFTextRenderingMode = (trFill, trStroke, trFillThenStroke, trInvisible,
    trFillClipping, trStrokeClipping, trFillStrokeClipping, trClipping);
  TVPDFImageCompressionType = (icFlate, icJpeg, icCCITT31, icCCITT32,
    icCCITT42);
  TVPDFPageLayout = (plSinglePage, plOneColumn, plTwoColumnLeft,
    plTwoColumnRight);
  TVPDFAnnotationSubType = (asTextNotes, asFreeText, asLine, asSquare, asCircle,
    asStamp, asFileAttachment, asSound, asMovie);
  TVPDFTextAnnotationType = (taComment, taKey, taNote, taHelp, taNewParagraph, taParagraph, taInsert);
  TVPDFFreeTextAnnotationJust = (ftLeftJust, ftCenter, ftRightJust);
  TVPDFCSAnnotationType = (csCircle, csSquare);
  TVPDFStampAnnotationType = (satApproved, satExperimental, satNotApproved, satAsIs, satExpired,
    satNotForPublicRelease, satConfidential, satFinal, satSold,
    satDepartmental, satForComment, satTopSecret, satDraft, satForPublicRelease);
  TVPDFPageSize = (psUserDefined, psLetter, psA4, psA3, psLegal, psB5, psC5,
    ps8x11, psB4, psA5, psFolio, psExecutive, psEnvB4, psEnvB5, psEnvC6,
    psEnvDL, psEnvMonarch, psEnv9, psEnv10, psEnv11);
  TVPDFBarcodeType =
    (bcCode_2_5_interleaved, bcCode_2_5_industrial, bcCode_2_5_matrix,
    bcCode39, bcCode39Extended, bcCode128A, bcCode128B, bcCode128C, bcCode93,
    bcCode93Extended, bcCodeMSI, bcCodePostNet, bcCodeCodabar, bcCodeEAN8, bcCodeEAN13,
    bcCodeUPC_A, bcCodeUPC_E0, bcCodeUPC_E1, bcCodeUPC_Supp2, bcCodeUPC_Supp5,
    bcCodeEAN128A, bcCodeEAN128B, bcCodeEAN128C);
  TVPDFPageMode = (pmUseNone, pmUseOutlines, pmUseThumbs, pmFullScreen, pmUseAttachments);
  TVPDFViewerPreference = (vpHideToolbar, vpHideMenubar, vpHideWindowUI,
    vpFitWindow, vpCenterWindow);
  TVPDFProtection = (prPrint, prModifyStructure, prInformationCopy,
    prEditAnnotations, prPrint12bit, prFillAnnotations, prExtractContent, prAssemble);
  TTIFFPaintType = (tptResizePage, tptResizeImage);
  TVPDFProtectOptions = set of TVPDFProtection;
  TVPDFViewerPreferences = set of TVPDFViewerPreference;

  TVPDFFontObj = class(TObject)
  private
    Name: AnsiString;
    Size: Single;
    ArrIndex: Integer;
    Saved: boolean;
    OldName: AnsiString;
    Ascent: Integer;
    FActive: boolean;
    IsUsed: boolean;
    UniLen: Integer;
    FontLen: Integer;
    IsUnicode: boolean;
    IsVertical: boolean;
    OrdinalName: AnsiString;
    IsStandard: boolean;
    FontStyle: TFontStyles;
    FontCharset: TFontCharset;
    IsMonospaced: boolean;
    OutTextM: OUTLINETEXTMETRIC;
    ABCArray: array[0..255] of ABC;
    Symbols: array of CDescript;
    UnicodeTable: array of IndexedChar;
    SymbolTable: array[32..255] of boolean;
    function GetCharWidth(AText: AnsiString; APos: integer): integer;
    procedure CopyFontFetures(InFnt: TVPDFFontObj);
    procedure GetFontFeatures;
    procedure ParseFontName;
    procedure ClearTables;
  end;

  TVPDF = class;
  TVPDFPage = class;

  TVPDFAnnotation = class(TObject)
  private
    FPage: TVPDFPage;
    FColor: array[0..3] of Byte;
    FType: TVPDFAnnotationSubType;
    FTypeState: AnsiString;
    FContents: AnsiString;
    FQuadding: Integer;
    FOpen: boolean;
    FLeftTop: TVPDFCurrPoint;
    FRightBottom: TVPDFCurrPoint;
    FName: AnsiString;
  protected
    procedure AddAnnotationObject;
  end;

  TVPDFDocOutlineObject = class(TObject)
  private
    FDoc: TVPDF;
    FParent: TVPDFDocOutlineObject;
    FNext: TVPDFDocOutlineObject;
    FPrev: TVPDFDocOutlineObject;
    FFirst: TVPDFDocOutlineObject;
    FLast: TVPDFDocOutlineObject;
    FTitle: AnsiString;
    FOpened: boolean;
  protected
    LinkedObj: TVPDFDictionaryObject;
    FCount: Integer;
    FTop: Integer;
    FLeft: Integer;
    procedure Init(AOwner: TVPDF);
  public
    function AddChild(Title: AnsiString; X: Single = 0; Y: Single = 0): TVPDFDocOutlineObject;
    property Parent: TVPDFDocOutlineObject read FParent;
    property Next: TVPDFDocOutlineObject read FNext;
    property Prev: TVPDFDocOutlineObject read FPrev;
    property First: TVPDFDocOutlineObject read FFirst;
    property Last: TVPDFDocOutlineObject read FLast;
    property Title: AnsiString read FTitle write FTitle;
    property Opened: boolean read FOpened write FOpened;
  end;

  TVPDFPage = class(TObject)
  private
    DPI: Single;
    FWordSpace: Single;
    FCharSpace: Single;
    FLeading: Single;
    FHorizontalScaling: Single;
    ISStated: Integer;
    STextBegin: boolean;
    FKBegin: boolean;
    SKBegin: boolean;
    FFillColor: TColor;
    FStrokeColor: TColor;
    FHyperColor: TColor;
    FMinXVal: Single;
    FMinYVal: Single;
    FMaxXVal: Single;
    FMaxYVal: Single;
    FDescStream: TStream;
    PageObjStream: TVPDFStreamObject;
    PageObj: TVPDFDictionaryObject;
    FResolution: Integer;
    FUpdateSize: boolean;
    mWidth: Single;
    mHeight: Single;
    FWidth: Single;
    FHeight: Single;
    FAnnotsObj: TVPDFArrayObject;
    FDocScale: Extended;
    FSize: TVPDFPageSize;
    XObjectObj: TVPDFObject;
    FontObjectObj: TVPDFObject;
    XObjectNames: array of AnsiString;
    FontArr: array of TVPDFFontObj;
    CurrentFontObj: TVPDFFontObj;
    FMediaBoxArray: TVPDFArrayObject;
    FOrientation: TVPDFPageOrientation;
    FTopTextPosition: boolean;
    PageContent: TStringList;
    PageMeta: TMetafile;
    FCanvas: TCanvas;
    procedure CloseCanvas;
    procedure ClosePage;
    procedure CalculateWidthFormat;
    procedure CalculateHeightFormat;
    procedure CalculateFormat;
    procedure ConvertPageObject;
    procedure SetResolution(const Value: Integer);
    function GetPageHeight: Single;
    function GetPageWidth: Single;
    procedure SetPageHeight(const Value: Single);
    procedure SetPageWidth(const Value: Single);
    procedure SetPageSize(const Value: TVPDFPageSize);
    procedure SetOrientation(const Value: TVPDFPageOrientation);
    procedure TurnPage;
    procedure StoreFont(FontObj: TVPDFFontObj);
    procedure SaveToPageStream(ValStr: AnsiString);
    function GetCanvas: TCanvas;
    function CompareCurrentFont: Integer;
    function XProjection(X: Single): Single;
    function YProjection(Y: Single): Single;
    function CompareResName(Index: Integer; Name: AnsiString): Integer;
    procedure CurveArc(CenterX, CenterY, RadiusX, RadiusY, StartAngle, SweepRange: Extended; UseMoveTo: Boolean);
    procedure ExecuteXObject(XOName: AnsiString);
    procedure DrawXObjectEx(X, Y, AWidth, AHeight: Single; ClipX, ClipY, ClipWidth, ClipHeight: Single; AXObjectName: AnsiString; angle: Extended; DocScale: Extended);
  protected
    function ProcChar(ComposChar: WORD): AnsiString;
    procedure RMoveTo(x, y: Single);
    procedure StoreCurrentFont;
    procedure InternUnicodeTextOut(X, Y: Single; Angle: Extended; Text: PWORD; TextLength: Integer);
    procedure FEllipse(X, Y, Width, Height: Single);
    procedure RotateCoordinate(X, Y, Angle: Extended; var XR, YR: Extended);
    procedure SetURIObject(UriLink: AnsiString; Left, Top, Right, Bottom: Extended);
  public
    FParent: TVPDF;
    constructor Create;
    destructor Destroy; override;
    procedure DrawPie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Extended);
    function DrawArc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Single): TVPDFCurrPoint;
    procedure GStateSave;
    function GStateRestore: boolean;
    procedure Concat(A, B, C, D, E, F: Single);
    procedure SetFlat(Flatness: Byte);
    procedure SetLineCap(Linecap: TLineCapStyle);
    procedure SetDash(DashArray: array of Byte; Phase: Byte);
    procedure NoDash;
    procedure AddTextAnnotation(Contents: AnsiString; Rectangle: TRect; Open: boolean; Name: TVPDFTextAnnotationType; Color: TColor = clRed);
    procedure AddFreeTextAnnotation(Contents: AnsiString; Rectangle: TRect; Quadding: TVPDFFreeTextAnnotationJust; Color: TColor = clRed);
    procedure AddLineAnnotation(Contents: AnsiString; BeginPoint: TVPDFCurrPoint; EndPoint: TVPDFCurrPoint; Color: TColor = clRed);
    procedure AddCircleSquareAnnotation(Contents: AnsiString; Rectangle: TRect; CSType: TVPDFCSAnnotationType; Color: TColor = clRed);
    procedure AddStampAnnotation(Contents: AnsiString; Rectangle: TRect; StampType: TVPDFStampAnnotationType; Color: TColor = clRed);
    procedure AddFileAttachmentAnnotation(Contents: AnsiString; FileName: AnsiString; Rectangle: TRect; Color: TColor = clRed);
    procedure AddSoundAnnotation(Contents: AnsiString; FileName: AnsiString; Rectangle: TRect; Color: TColor = clRed);
    procedure AddMovieAnnotation(Contents: AnsiString; FileName: AnsiString; Rectangle: TRect; Color: TColor = clRed);
    procedure SetLineJoin(LineJoin: TLineJoinStyle);
    procedure SetLineWidth(Width: Single);
    procedure SetMiterLimit(MiterLimit: Byte);
    procedure CurveToC(X1, Y1, X2, Y2, X3, Y3: Single);
    procedure CurveToV(X2, Y2, X3, Y3: Single);
    procedure CurveToY(X1, Y1, X3, Y3: Single);
    procedure FMEllipse(X, Y, X1, Y1: Single);
    procedure MFRectangle(X, Y, X1, Y1: Single);
    procedure Rectangle(X, Y, Width, Height: Single);
    procedure RectangleRotate(X, Y, Width, Height: Single; Angle: Extended);
    procedure SetCharacterSpacing(Spacing: Single);
    procedure SetWordSpacing(Spacing: Single);
    procedure SetHorizontalScaling(Scaling: Single);
    procedure SetLeading(Leading: Single);
    procedure SetTextRenderingMode(Mode: TPDFTextRenderingMode);
    procedure SetTextRise(Rise: SmallInt);
    procedure MoveTextPoint(X, Y: Single);
    procedure SetTextMatrix(a, b, c, d, x, y: Single);
    procedure MoveToNextLine;
    procedure ShowText(Text: AnsiString; IsHexadecimal: boolean = false);
    procedure ShowUnicodeText(Text: WideString);
    procedure SetRGBHyperlinkColor(Value: TColor);
    procedure SetRGBColor(Value: TColor);
    procedure SetRGBFillColor(Value: TColor);
    procedure SetRGBStrokeColor(Value: TColor);
    procedure SetGrayColor(GrayColor: Extended);
    procedure SetGrayFillColor(GrayColor: Extended);
    procedure SetGrayStrokeColor(GrayColor: Extended);
    procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer);
    procedure Circle(X, Y, Radius: Single);
    procedure Ellipse(X, Y, Width, Height: Single);
    procedure DrawBarcode(BCType: TVPDFBarcodeType; X, Y, Height, MUnit:
      Integer; Angle: Single; Info: AnsiString; UseCheckSum: Boolean; BarColor,
      Color: TColor);
    procedure ProcessFont(Unicoded: boolean);
    procedure PrintHyperlink(X, Y: Single; Text, Link: AnsiString);
    procedure SetFont(FontName: AnsiString; FontStyle: TFontStyles; ASize: Single;
      FontCharset: TFontCharset = ANSI_CHARSET; IsVertical: boolean = false);
{$IFDEF BCB}
    procedure UnicodeTextOut(X, Y: Single; Angle: Extended; Text: PWORD; TextLength: Integer);
    procedure UnicodeTextOutStr(X, Y: Single; Angle: Extended; Text: WideString);
    procedure PrintText(X, Y: Single; Angle: Extended; Text: AnsiString);
    procedure OutText(X, Y: Single; Angle: Extended; Text: AnsiString);
{$ELSE}
    procedure UnicodeTextOut(X, Y: Single; Angle: Extended; Text: PWORD; TextLength: Integer); overload;
    procedure UnicodeTextOut(X, Y: Single; Angle: Extended; Text: WideString); overload;
    procedure TextOut(X, Y: Single; Angle: Extended; Text: AnsiString);
{$ENDIF}
    function TextWidth(Text: AnsiString): Single;
    function TextHeight(Text: AnsiString): Real;
    procedure SetFontAndSize(FontName: AnsiString; Size: Single);
{$IFDEF BCB}
    procedure ShowMetafileEx(MetaFile: TMetaFile);
    procedure ShowMetafile(MetaFile: TMetafile; X, Y, HorScale, VertScale:
      Extended);
{$ELSE}
    procedure ShowMetafile(MetaFile: TMetaFile); overload;
    procedure ShowMetafile(MetaFile: TMetafile; X, Y, HorScale, VertScale:
      Extended); overload;
{$ENDIF}
    procedure BeginText;
    procedure EndText;
    procedure ShowImage(ImageIndex: Integer; x, y, w, h, Angle: Extended);
    procedure MoveTo(X, Y: Single);
    procedure LineTo(X, Y: Single);
    procedure Stroke;
    procedure ClosePath;
    procedure NewPath;
    procedure ClosePathStroke;
    procedure Fill;
    procedure EoFill;
    procedure FillAndStroke;
    procedure ClosePathFillAndStroke;
    procedure EoFillAndStroke;
    procedure ClosePathEoFillAndStroke;
    procedure Clip;
    procedure EoClip;
    property Canvas: TCanvas read GetCanvas;
    property TopTextPosition: boolean read FTopTextPosition write FTopTextPosition;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -