unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, CommDlg;


type

    TStaticPasswordCallBack = function(pdfFileName : LPCSTR ;
                                      pdfPassword : LPSTR ;
                                      passwordLen : PInteger
                                      ):HRESULT ; stdcall;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
    vPdfhand, vPdfFilehand : THandle   ;
  public
    { Public declarations }
  end;                                                                     //
  function PDF_Startup(parentWnd : HWND ; licenseNum : PChar ) : HWND  ; stdcall ; external 'PdfEngine.dll';
  procedure PDF_SetLicenseNum(licenseNum : PChar ) ; stdcall; external 'PdfEngine.dll';
  procedure PDF_Shutdown(); stdcall; external 'PdfEngine.dll';
  procedure PDF_Resize(hPDF : HWND ; cx : Integer ; cy : Integer ); stdcall; external 'PdfEngine.dll';
  function PDF_OpenPDF(hPDF : HWND ; vvfilename : LPCSTR ): HRESULT   ; stdcall; external 'PdfEngine.dll';
  procedure PDF_ClosePDF(hPDF : HWND); stdcall; external 'PdfEngine.dll';

  function PDF_Print(hPDF:HWND; hPrinterDC:HWND; hDevMode:HWND; nFromPage:Integer; nToPage:Integer):HRESULT; stdcall; external 'PdfEngine.dll';



  procedure PDF_SetPasswordCallback (passwordCallback : TStaticPasswordCallBack); stdcall; external 'PdfEngine.dll';//static ;


  {//启动PDF模块，parentWnd是指父窗体的句柄。 PDF将显示在那个区域。  licenseNum是PDF组件的正版序列号
//返回值为PDF组件的标记
HANDLE PDF_Startup (HWND parentWnd, char * licenseNum);

// 除了上面PDF_Startup传入序列号外，也可以通过该函数单独传入。
void PDF_SetLicenseNum (char * licenseNum);

// 程序结束时，或者不再需要PDF组件时，关闭整个PDF组件，如果只是关闭某个文档的显示，不需要调用这个，只需要调用PDF_ClosePDF
void PDF_Shutdown ();

// 窗口大小变化后，通知内部，刷新PDF显示区域的大小。
void PDF_Resize(HANDLE hPDF, int cx, int cy);

// 打开一个PDF文件，hPDF就是PDF_Startup传出的结果， pdfFile是PDF文件的全路径
HRESULT PDF_OpenPDF(HANDLE hPDF, const char * pdfFile);

// 关闭当前在显示的PDF文件
void PDF_ClosePDF(HANDLE hPDF);

// 打印PDF
void PDF_Print(
    HANDLE              hPDF,           // PDF文件的句柄，通过PDF_OpenPDF获得
    HDC                 hPrinterDc,     // 打印机DC句柄，通过PrintDlg（系统API）返回
    HANDLE              hDevMode,       // 打印模式（横向竖向等）
    int                 nFromPage,      // 从第几页
    int                 nToPage         // 到第几页 （对应打印界面的选择）
    );

// 进入首页
void PDF_GotoFirstPage(HANDLE hPDF);

// 翻到最后一页
void PDF_GotoLastPage(HANDLE hPDF);

// 下一页
int PDF_GotoNextPage(HANDLE hPDF);

// 前一页
int PDF_GotoPreviousPage(HANDLE hPDF);

// 到指定的某页，lPageNumber传入页码
int PDF_GotoThisPage(HANDLE hPDF, long lPageNumber);

// 设置显示模式：单页还是双页显示
void PDF_SetDisplayMode(HANDLE hPDF, BOOL bSinglePage);

// 设置是否连续模式
void PDF_SetContinuous (HANDLE hPDF, BOOL bContinuous);

// 滚动条滚动时，让PDF内部跟着滚动一下。
void PDF_VScroll (HANDLE hPDF, BOOL bUp);

// 获取当前显示模式：是否单页（否则双页）
BOOL PDF_GetDisplayMode(HANDLE hPDF);

// 获取当前第几页
int PDF_GetCurrentPage(HANDLE hPDF);

// 获取总页数
int PDF_GetPageCount(HANDLE hPDF);

// 设置背景颜色
BOOL PDF_SetBackgroundColor(HANDLE hPDF, long color);

// 重置默认颜色
BOOL PDF_ResetColor(HANDLE hPDF);

// 设置页面颜色
void PDF_SetPaperColor(HANDLE hPDF, long color);

// 是否搜到指定的关键字
BOOL PDF_Find(HANDLE hPDF, LPWSTR strKeyword);

// 查找时找上一个符合条件的
BOOL PDF_FindPrevious(HANDLE hPDF);

// 找下一个符合条件的
BOOL PDF_FindNext(HANDLE hPDF);

// 缩放比例。 -1代表：适合页面大小  -2：代表：适合宽度
// 缩放比例是按百分比来设置的，比如传入100，代表原始大小，传入200代表2倍大小（200%）
void PDF_ZoomTo (HANDLE hPDF, double zoom);}

var
  Form1: TForm1;


implementation

{$R *.dfm}

function StaticPasswordCallBack(pdfFileName : LPCSTR ;
                                pdfPassword : LPSTR ;
                                passwordLen : PInteger
                                ):HRESULT ;stdcall;
var
  s : string ;
  TempdfPassword : LPSTR ;
  i : Integer ;
begin //回调函数
  //if passwordLen = null then
      //Result := E_INVALIDARG ;
  s := '12345678';

            StrPCopy(pdfPassword, '12345678');
            passwordLen^ := 8;
      //pdfPassword := '12345678';
  //StrPCopy( TempdfPassword , s );
  //ShowMessage( TempdfPassword  );
  //ShowMessage(IntToStr(SizeOf(PAnsiChar(s) ) ) +',' + IntToStr(Length (PAnsiChar(s) )) +',' + IntToStr(Length (s )));
  //fPassword   := ansiStrAlloc(6);
  //Move( LPSTR(s)^  , pdfPassword ,   6 );
  //for i := 0 to Length(s) - 1 do
     //pdfPassword[i] := PAnsiChar(s)[i] ;

   //Move(s, pdfPassword, 6);
  //MoveMemory(LPSTR( s) , TempdfPassword , 6);
  //windows.MoveMemory(@TempdfPassword, @s, Length(s));

  //StrPCopy(@pdfPassword[0], '123456');
  //CopyMemory( TempdfPassword  , PAnsiChar(s) ,6);
  //CopyMemory( pdfPassword , TempdfPassword ,Length(TempdfPassword );
  //StrPCopy( pdfPassword , s );
  //StrMove(pdfPassword , TempdfPassword , sizeof(TempdfPassword) );
  //Move(pdfPassword , TempdfPassword, sizeof(TempdfPassword ));
  //fPassword := TempdfPassword ;
  //StrPCopy( pdfPassword, vpdfPasswordValue );
  //ShowMessage( TempdfPassword  );
  //Move(pdfPassword , PAnsiChar(s) , sizeof(PAnsiChar(s) ));
  //StrMove(pdfPassword , PAnsiChar(s) , sizeof(s));
  //StrPCopy( pdfPassword, s );

 //Move(pdfPassword,   PChar(S) ,   sizeof(s) );
  //fPassword := PChar(S);
  //passwordLen := Length(s);
  {if  passwordLen = null then
      begin
          passwordLen := Length(s);
          Result := E_FAIL ;
      end;
  {}

  Result := S_OK ;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
 var
    Pd : TPrintDlg;
begin

  //Close ;
  // 先要确保PDF已经打开，这里需要先判断下vPdfHand不为0

  // http://baike.baidu.com/view/2750613.htm

    FillChar(Pd,   sizeof(Pd),   #0);
    Pd.lStructSize   :=   sizeof(Pd);
    Pd.hWndOwner   :=   Form1.Handle;
    Pd.Flags   :=   PD_USEDEVMODECOPIESANDCOLLATE or PD_RETURNDC;
    Pd.nCopies := 1;
    Pd.nFromPage := 1;
    Pd.nToPage   := 2;//PDF_GetPageCount();  此处应该调用获取总页码
    Pd.nMinPage  := 1;
    Pd.nMaxPage  := 2; //PDF_GetPageCount();  此处应该调用获取总页码
    if   PrintDlg(pd)   then   begin
        PDF_Print (Self.vPdfhand, Pd.hDC, Pd.hDevMode, Pd.nFromPage, Pd.nToPage);
    end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  i : HRESULT ;
begin
  try  //  vPdfFilehand    //Self.Panel2.Handle
      PDF_SetPasswordCallback( @StaticPasswordCallBack  );
      i := PDF_OpenPDF(Self.vPdfhand  , PAnsiChar('D:\1.pdf'));
  except
      ON E : Exception do
          begin
              ShowMessage(E.Message );
          end;
  end;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  if vPdfFilehand <> 0 then
      PDF_ClosePDF(vPdfFilehand);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if vPdfFilehand <> 0 then
      PDF_ClosePDF(vPdfFilehand);
  PDF_Shutdown();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  vPdfhand :=  0;
  vPdfFilehand := 0 ;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  //try
     //  SELF.Panel2.Handle
     vPdfhand := PDF_Startup( Self.Panel2.Handle  , PChar('')  );
  //except
      //ON E : Exception do
         // begin
           //   ShowMessage(E.Message );
         // end;
  //end;
end;

end.
