如何给打印机添加一个自定义纸张类型?(100分)

  • 主题发起人 主题发起人 wintle
  • 开始时间 开始时间
W

wintle

Unregistered / Unconfirmed
GUEST, unregistred user!
由于需要打印的大小是16K的,而有些打印机没有这种纸张类型。打印控件是whf的reportmachine2.4版的,在这种情况下,打印预览就发现纸型变了。。我现在的想法是有没有可能由程序自动检测打印机是否有16K的纸型(具体为 16 开(18.4 x 26厘米) ),如果没有则添加一个自定义纸型如上,请问怎么办?
非常感激!
 
这样吧,用Delphi举个例子吧,以下程序将打印机纸张设为:114mm*190mm:
procedure PreparePrinter;
var
aDevice: array[0..CCHDEVICENAME-1] of Char;
aDriver: array[0..MAX_PATH-1] of Char;
aPort: array[0..31] of Char;
hDevMode: THandle;
pDevMode: PDeviceMode;
begin
// 获取打印机DeviceMode的句柄
Printer.GetPrinter(aDevice, aDriver, aPort, hDevMode);
if hDevMode <> 0 then
begin
// 获取指向DeviceMode的指针
pDevMode := GlobalLock(hDevMode);
if pDevMode <> nil then
begin
pDevMode^.dmPaperSize := DMPAPER_USER;
pDevMode^.dmPaperLength := 1140;
pDevMode^.dmPaperWidth := 1900;
pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERSIZE;
pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERLENGTH;
pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERWIDTH;
ResetDC(Printer.Handle, pDevMode^);
GlobalUnlock(hDevMode);
end;
end;
end;
用修改
DeviceMode的方法的话,只是改变你程序中的打印机设置,不会影响其他程序打印的。
你试试这个资料看看呗
 
需要设置以下两个地方
1.打印机属性-设备设置
2.打印机属性-常规-打印首选项-高级
 
谢谢,我马上试试。。
 
枚举指定打印机上定义的纸张名称:
procedure GetPaperList(PrinterName: String;
PaperList: TStrings);
type
PPaperName = ^TPaperName;
TPaperName = array [0..0] of array [0..63] of char;
var
hPrinter: THandle;
pd: PRINTER_DEFAULTS;
Buf: Pointer;
pPaper: PPaperName;
dwNeeded, i: DWORD;
begin
PaperList.Clear;
pd.DesiredAccess := PRINTER_ALL_ACCESS;
pd.pDatatype := nil;
pd.pDevMode := nil;
// 打开打印机
if OpenPrinter(PChar(PrinterName),hPrinter,@pd) then
begin
dwNeeded := DeviceCapabilities(PChar(PrinterName), nil,
DC_PAPERNAMES, nil, nil);
if dwNeeded > 0 then
begin
GetMem(Buf, (dwNeeded + 1)* 64);
try
dwNeeded := DeviceCapabilities(PChar(PrinterName), nil,
DC_PAPERNAMES, Buf, nil);
pPaper := PPaperName(Buf);
for i := 0 to dwNeeded - 1do
begin
PaperList.Add(pPaper);
end;
finally
FreeMem( Buf );
end;
end;
end;
end;

示例:
// 取列表中打印机HP LaserJet 6P中定义的纸张名称
procedure TForm1.Button2Click(Sender: TObject);
begin
GetPaperList('HP LaserJet 6L', lbPaperList.Items )
end;
 
谢谢各位,虽然没有通过这个方法解决问题,但问题还是被解决了。对报表进行了控制。
如果谁知道可以通过程序添加自定义纸张,或者和word里一样,不管你是什么打印机,反正就一定会有那几种我们常用的纸型的方法,请告诉我哈!
 

Similar threads

I
回复
0
查看
664
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
820
import
I
后退
顶部