功能类似于移动收费回执单的打印.怎样实现连打,在打完一张后直接打印下一张.就是往单据表格里打印内容,单据是已经有的,只是把内容打印上.现在能够实现单张打印,在连续打印时,第二张的位置固定不住,怎样控制打印机的跑纸距离.也就是说现在每张打印都要手动调试单据位置,打印完第一张后,第二张位置就不对了,还需要调,如何解决这个问题.

解决方案 »

  1.   

    To lidong6(立冬)"需要添加该纸大小格式"
    如何添加大小格式啊???在线等~~~
      

  2.   

    把下面的代码复制到一个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">&nbsp;</td> 
    <td width="28%" class="tdp">&nbsp;</td> 
    <td width="43%" class="tdp">&nbsp;</td> 
    </tr> 
    <tr> 
    <td colspan="3" class="tdp">&nbsp;</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>&nbsp;</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">&nbsp;</td> 
    </tr> 
    <tr> 
    <td class="tdp">&nbsp;</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>&nbsp;</td> 
    </tr> 
    </table></td> 
    </tr> 
    </table> 
    </body> 
    </html> 
      

  3.   

    printDocument.DefaultPageSettings.PaperSize =
                        new PaperSize("自定义", width, height);
    width和height就是你设置的大小。
      

  4.   

    我以前是用了一堆API(主要是winspool.drv库中的AddForm 函数)实现的添加纸张格式,很麻烦。现在.NET类库中System.Drawing.Printing命名空间下应该有更简单的方法,你自己可以先查查该空间下的方法。
      

  5.   

    添加自定义纸张代码: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);
      

  6.   

    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);                }            }        }    }
    }