以下代码是以前在  csdn  找的,完全可以用,增加的新纸张(Form)  也增加了.  
但是,有如下问题:  
1、增加的新纸张增加到了打印机的“服务器属性”里面的纸张列表了。一些打印机如:Epson  LQ  -1600,300K....都可以用。以下代码也可以用。  
2、但,我刚装了一个  HP  Laser  Jet  1020  的激光打印机,发现它的打印纸张列表和系统打印机的“服务器属性”里面的纸张列表不同。调用下面的代码增加的纸张只增加到系统打印机的“服务器属性”的纸张列表里,而没有增加到这个激光打印机的纸张列表里。  
  而打开这个激光打印机的“属性”->“打印首选项”,里面也可以增加新纸张并设置大小,程序里可以选择这个大小打印。  
 
结论:也就是说,这个激光打印机的纸张列表属性和系统是分开的。下面的代码对这个另外的不起作用。  
------------------------  
 
问题:  
如何程序向这个激光打印机的纸张列表增加新纸张呢?或者说,调用下面代码,向所有打印机的纸张列表都增加呢?  
 
 
function  TForm1.AddPrinterFormNT(FormName:string;width,height:integer):integer;  
var  
   Device,  Driver,  Port:  array[0..127]  of  char;  
   hDevMode:  THandle;  
   PDevMode:  PDeviceMode;  
begin  
   result:=-2;  
   Printer.GetPrinter(Device,  Driver,  Port,  hDevMode);  
 
   if  hDevMode  <>  0  then  
   begin  
       PDevMode  :=  GlobalLock(hDevMode);  
       result:=WinNTSetForm(FormName,width,height,PDevMode,  Device,  Port);  
   end;  
end;  
 
function  TForm1.WinNTSetForm(FormName:string;width,height:integer;PDevMode:  PDeviceMode;Device:  PChar;  Port:  PChar):  integer;  
var  
   hPrinter:  THandle;  
   pForm:  Pointer;  
   cbNeeded:  DWORD;  
   cReturned:  DWORD;  
   FormInfo1:  TFormInfo1;  
begin  
   Result  :=  -2;  
   if  OpenPrinter(Device,  hPrinter,  nil)  then  
   begin  
       pForm  :=  nil;  
       EnumForms(hPrinter,  1,  pForm,  0,  cbNeeded,  cReturned);  
       GetMem(pForm,  cbNeeded);  //取pForm的大小并分配内存  
       try  
           if  EnumForms(hPrinter,  1,  pForm,  cbNeeded,  cbNeeded,  cReturned)  then  
           begin  
               if  DeleteForm(hPrinter,  PChar(FormName))  then  
                   Dec(cReturned);  //删除旧的Form  
               with  FormInfo1  do  
               begin  
                   Flags  :=  0;  
                   pName  :=  PChar(FormName);  
                   Size.cx  :=  width  *  100;  
                   Size.cy  :=  height  *  100;  
                   with  ImageAbleArea  do  
                   begin  
                       Left  :=  0;  
                       Top  :=  0;  
                       Right  :=  Size.cx;  
                       Bottom  :=  Size.cy;  
                   end;  
               end;  
               if  AddForm(hPrinter,  1,  @FormInfo1)  then  
               begin  
                   Printer.PrinterIndex  :=  Printer.PrinterIndex;  
                   PDevMode.dmFields  :=  PDevMode.dmFields  or  DM_PAPERSIZE;  
                   PDevMode.dmPaperSize  :=  cReturned  +  1;  
                   Printer.PrinterIndex  :=  Printer.PrinterIndex;  
                   Result  :=  cReturned;  
               end;  
           end;  
       finally  
           FreeMem(pForm);  
       end;  
   end;  
end;