[**高分求教**]有关套打的问题~~都进来关注一下,急用!!!!

挺拔的劲松 2006-09-21 08:38:23
功能类似于移动收费回执单的打印.

怎样实现连打,在打完一张后直接打印下一张.就是往单据表格里打印内容,单据是已经有的,只是把内容打印上.

现在能够实现单张打印,在连续打印时,第二张的位置固定不住,怎样控制打印机的跑纸距离.

也就是说现在每张打印都要手动调试单据位置,打印完第一张后,第二张位置就不对了,还需要调,如何解决这个问题.
...全文
233 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
enghui 2006-09-21
  • 打赏
  • 举报
回复
public System.Drawing.Printing.PaperSize GetPrintForm(string printerName, string paperName)
{
System.Drawing.Printing.PaperSize paper = null;
System.Drawing.Printing.PrinterSettings printer = new System.Drawing.Printing.PrinterSettings();
printer.PrinterName = printerName;

foreach (System.Drawing.Printing.PaperSize ps in printer.PaperSizes)
{
if (ps.PaperName.ToLower() == paperName.ToLower())
{
paper = ps;
break;
}
}
return paper;

}

public void SetPrintForm(string printerName, string paperName, float width, float height)
{

if (PlatformID.Win32NT == Environment.OSVersion.Platform)
{
const int PRINTER_ACCESS_USE = 0x00000008;
const int PRINTER_ACCESS_ADMINISTER = 0x00000004;

structPrinterDefaults defaults = new structPrinterDefaults();

defaults.pDatatype = null;

defaults.pDevMode = IntPtr.Zero;

defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE;

IntPtr hPrinter = IntPtr.Zero;
if (OpenPrinter(printerName, out hPrinter, ref defaults))
{

try
{

structFormInfo1 formInfo = new structFormInfo1();

formInfo.Flags = 0;

formInfo.pName = paperName;

formInfo.Size.width = (int)(width * 1000.0);

formInfo.Size.height = (int)(height * 1000.0);

formInfo.ImageableArea.left = 0;

formInfo.ImageableArea.right = formInfo.Size.width;

formInfo.ImageableArea.top = 0;

formInfo.ImageableArea.bottom = formInfo.Size.height;

bool rslt = false;
if (GetPrintForm(printerName, paperName) != null)
{
rslt = SetForm(hPrinter, paperName, 1, ref formInfo);
}
else
{
this.AddCustomPaperSize(printerName, paperName, width, height);
rslt = true;
}
if (!rslt)
{

StringBuilder strBuilder = new StringBuilder();

strBuilder.AppendFormat("添加纸张{0}时发生错误!, 系统错误号: {1}", paperName, GetLastError());

//throw new ApplicationException(strBuilder.ToString());
MessageBox.Show(strBuilder.ToString());

}

}

finally
{

ClosePrinter(hPrinter);

}

}
}

}

public void AddCustomPaperSize(string printerName, string paperName, float width, float height)
{

if (PlatformID.Win32NT == Environment.OSVersion.Platform)
{
const int PRINTER_ACCESS_USE = 0x00000008;
const int PRINTER_ACCESS_ADMINISTER = 0x00000004;

structPrinterDefaults defaults = new structPrinterDefaults();

defaults.pDatatype = null;

defaults.pDevMode = IntPtr.Zero;

defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE;

IntPtr hPrinter = IntPtr.Zero;
if (OpenPrinter(printerName, out hPrinter, ref defaults))
{

try
{

DeleteForm(hPrinter, paperName);

structFormInfo1 formInfo = new structFormInfo1();

formInfo.Flags = 0;

formInfo.pName = paperName;

formInfo.Size.width = (int)(width * 1000.0);

formInfo.Size.height = (int)(height * 1000.0);

formInfo.ImageableArea.left = 0;

formInfo.ImageableArea.right = formInfo.Size.width;

formInfo.ImageableArea.top = 0;

formInfo.ImageableArea.bottom = formInfo.Size.height;

if (!AddForm(hPrinter, 1, ref formInfo))
{

StringBuilder strBuilder = new StringBuilder();

strBuilder.AppendFormat("添加纸张{0}时发生错误!, 系统错误号: {1}", paperName, GetLastError());

throw new ApplicationException(strBuilder.ToString());

}

}

finally
{

ClosePrinter(hPrinter);

}

}

else
{

StringBuilder strBuilder = new StringBuilder();

strBuilder.AppendFormat("打开打印机{0} 时出现异常!, 系统错误号: {1}", printerName, GetLastError());

throw new ApplicationException(strBuilder.ToString());

}

}

else
{

structDevMode pDevMode = new structDevMode();

IntPtr hDC = CreateDC(null, printerName, null, ref pDevMode);

if (hDC != IntPtr.Zero)
{

const long DM_PAPERSIZE = 0x00000002L;

const long DM_PAPERLENGTH = 0x00000004L;

const long DM_PAPERWIDTH = 0x00000008L;

pDevMode.dmFields = (int)(DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH);

pDevMode.dmPaperSize = 256;

pDevMode.dmPaperWidth = (short)(width * 2.54 * 10000.0);

pDevMode.dmPaperLength = (short)(height * 2.54 * 10000.0);

ResetDC(hDC, ref pDevMode);

DeleteDC(hDC);

}

}

}

}
}
enghui 2006-09-21
  • 打赏
  • 举报
回复
添加自定义纸张代码:

using System;
using System.Text;
using System.Runtime;
using System.Security;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace lumber
{

public class DBPaperSize
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

internal struct structPrinterDefaults
{

[MarshalAs(UnmanagedType.LPTStr)]
public String pDatatype;

public IntPtr pDevMode;

[MarshalAs(UnmanagedType.I4)]
public int DesiredAccess;

};

[DllImport("winspool.Drv", EntryPoint = "OpenPrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPTStr)]
string printerName,

out IntPtr phPrinter,

ref structPrinterDefaults pd);

[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern bool ClosePrinter(IntPtr phPrinter);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

internal struct structSize
{

public Int32 width;

public Int32 height;

}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

internal struct structRect
{

public Int32 left;

public Int32 top;

public Int32 right;

public Int32 bottom;

}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

internal struct structFormInfo1
{

[MarshalAs(UnmanagedType.I4)]
public int Flags;

[MarshalAs(UnmanagedType.LPTStr)]
public String pName;

public structSize Size;

public structRect ImageableArea;

};

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

internal struct structDevMode
{

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public String dmDeviceName;

[MarshalAs(UnmanagedType.U2)]
public short dmSpecVersion;

[MarshalAs(UnmanagedType.U2)]
public short dmDriverVersion;

[MarshalAs(UnmanagedType.U2)]
public short dmSize;

[MarshalAs(UnmanagedType.U2)]
public short dmDriverExtra;

[MarshalAs(UnmanagedType.U4)]
public int dmFields;

[MarshalAs(UnmanagedType.I2)]
public short dmOrientation;

[MarshalAs(UnmanagedType.I2)]
public short dmPaperSize;

[MarshalAs(UnmanagedType.I2)]
public short dmPaperLength;

[MarshalAs(UnmanagedType.I2)]
public short dmPaperWidth;

[MarshalAs(UnmanagedType.I2)]
public short dmScale;

[MarshalAs(UnmanagedType.I2)]
public short dmCopies;

[MarshalAs(UnmanagedType.I2)]
public short dmDefaultSource;

[MarshalAs(UnmanagedType.I2)]
public short dmPrintQuality;

[MarshalAs(UnmanagedType.I2)]
public short dmColor;

[MarshalAs(UnmanagedType.I2)]
public short dmDuplex;

[MarshalAs(UnmanagedType.I2)]
public short dmYResolution;

[MarshalAs(UnmanagedType.I2)]
public short dmTTOption;

[MarshalAs(UnmanagedType.I2)]
public short dmCollate;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public String dmFormName;

[MarshalAs(UnmanagedType.U2)]
public short dmLogPixels;

[MarshalAs(UnmanagedType.U4)]
public int dmBitsPerPel;

[MarshalAs(UnmanagedType.U4)]
public int dmPelsWidth;

[MarshalAs(UnmanagedType.U4)]
public int dmPelsHeight;

[MarshalAs(UnmanagedType.U4)]
public int dmNup;

[MarshalAs(UnmanagedType.U4)]
public int dmDisplayFrequency;

[MarshalAs(UnmanagedType.U4)]
public int dmICMMethod;

[MarshalAs(UnmanagedType.U4)]
public int dmICMIntent;

[MarshalAs(UnmanagedType.U4)]
public int dmMediaType;

[MarshalAs(UnmanagedType.U4)]
public int dmDitherType;

[MarshalAs(UnmanagedType.U4)]
public int dmReserved1;

[MarshalAs(UnmanagedType.U4)]
public int dmReserved2;

}

[DllImport("winspool.Drv", EntryPoint = "AddForm", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern bool AddForm(IntPtr phPrinter, [MarshalAs(UnmanagedType.I4)] int level, ref structFormInfo1 form);

[DllImport("winspool.Drv", EntryPoint = "DeleteForm", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern bool DeleteForm(IntPtr phPrinter, [MarshalAs(UnmanagedType.LPTStr)] string pName);

[DllImport("winspool.Drv", EntryPoint = "SetForm", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern bool SetForm(IntPtr phPrinter, [MarshalAs(UnmanagedType.LPTStr)] string pName, [MarshalAs(UnmanagedType.I4)] int level, ref structFormInfo1 form);

[DllImport("kernel32.dll", EntryPoint = "GetLastError", SetLastError = false, ExactSpelling = true, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern Int32 GetLastError();
[DllImport("GDI32.dll", EntryPoint = "CreateDC", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern IntPtr CreateDC([MarshalAs(UnmanagedType.LPTStr)]string pDrive, [MarshalAs(UnmanagedType.LPTStr)] string pName, [MarshalAs(UnmanagedType.LPTStr)] string pOutput, ref structDevMode pDevMode);
[DllImport("GDI32.dll", EntryPoint = "ResetDC", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern IntPtr ResetDC(IntPtr hDC, ref structDevMode pDevMode);
[DllImport("GDI32.dll", EntryPoint = "DeleteDC", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
internal static extern bool DeleteDC(IntPtr hDC);
lidong6 2006-09-21
  • 打赏
  • 举报
回复
我以前是用了一堆API(主要是winspool.drv库中的AddForm 函数)实现的添加纸张格式,很麻烦。

现在.NET类库中System.Drawing.Printing命名空间下应该有更简单的方法,你自己可以先查查该空间下的方法。
路人霆 2006-09-21
  • 打赏
  • 举报
回复
printDocument.DefaultPageSettings.PaperSize =
new PaperSize("自定义", width, height);
width和height就是你设置的大小。
copico 2006-09-21
  • 打赏
  • 举报
回复
把下面的代码复制到一个HTML页里,然后打开该页看效果
<html>
<head>
<title>看看</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<!--media=print 这个属性可以在打印时有效-->
<style media=print>
.Noprint{display:none;}
.PageNext{page-break-after: always;}
</style>



</head>

<body >
<center class="Noprint" >
<p>
<OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0>
</OBJECT>
<input type=button value=打印 onclick=document.all.WebBrowser.ExecWB(6,1)>
<input type=button value=直接打印 onclick=document.all.WebBrowser.ExecWB(6,6)>
<input type=button value=页面设置 onclick=document.all.WebBrowser.ExecWB(8,1)>
</p>
<p> <input type=button value=打印预览 onclick=document.all.WebBrowser.ExecWB(7,1)>
<br/>
</p>
<hr align="center" width="90%" size="1" noshade>
</center>

<table width="90%" border="0" align="center" cellpadding="2" cellspacing="0" class="tabp">
<tr>
<td colspan="3" class="tdp">第1页</td>
</tr>
<tr>
<td width="29%" class="tdp"> </td>
<td width="28%" class="tdp"> </td>
<td width="43%" class="tdp"> </td>
</tr>
<tr>
<td colspan="3" class="tdp"> </td>
</tr>
<tr>
<td colspan="3" class="tdp"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" class="tdp"><p>这样的报表</p>
<p>对一般的要求就够了。</p></td>
<td> </td>
</tr>
</table></td>
</tr>
</table>
<hr align="center" width="90%" size="1" noshade class="NOPRINT" >
<!--分页-->
<div class="PageNext"></div>
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="0" class="tabp">
<tr>
<td class="tdp">第2页</td>
</tr>
<tr>
<td class="tdp">看到分页了吧</td>
</tr>
<tr>
<td class="tdp"> </td>
</tr>
<tr>
<td class="tdp"> </td>
</tr>
<tr>
<td class="tdp"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" class="tdp"><p>这样的报表</p>
<p>对一般的要求就够了。</p></td>
<td> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>

挺拔的劲松 2006-09-21
  • 打赏
  • 举报
回复
up
挺拔的劲松 2006-09-21
  • 打赏
  • 举报
回复
To lidong6(立冬)

"需要添加该纸大小格式"
如何添加大小格式啊???

在线等~~~
lidong6 2006-09-21
  • 打赏
  • 举报
回复
有些打印机的驱动程序不支持太小的纸,这时就用支持小纸的驱动程序(很多驱动程序都可以混用)
lidong6 2006-09-21
  • 打赏
  • 举报
回复
设置纸张大小。
如果纸张大小系统已经有了,设置打印机使用该属性。
如果没有该大小,需要添加该纸大小格式。

用程序和手动操作都可以实现
手动的实现在打印机控制面板中操作。
kbxj406 2006-09-21
  • 打赏
  • 举报
回复
up too
挺拔的劲松 2006-09-21
  • 打赏
  • 举报
回复
up

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧