• C# 调用打印机打印机pdf



    之前做TMS、WMS系统的时候,经常要对接条码打印机来打印标签。
    市面上主流的条码打印机有佳博,TSC,斑马,博思得。
    这几个品牌打印机的官方SDK都大同小异,都是使用非托管dll调用函数,发送指令给打印机。
    标签布局是使用X Y轴来定位的,文本换行还得自己计算文本长度截取换行,所以画标签样式还挺费时间的。

    最近公司有新需求,使用动态标签。让客户自己随时配置标签的样式:配置了样式,后面打印标签的格式就是这样。

     如果要做到这样,显然官方SDK是很困难的。因为本身XY轴就不好控制,而且官方SDK还不支持图片,表格这些。并且还得为每个品牌打印机编写代码,因为每个品牌的类库,dll不一样。

    我想到的解决办法是:打印标签的时候根据动态标签模板画html,然后将html转pdf,最后调用pdf打印机。

    这样做的好处是:打印机出来的标签样式基本上可以和配置的模板一样。

            不需要每个品牌打印机都编写标签布局代码了,不需要安装打印机驱动,因为使用pdf打印。

     

    实现步骤:

    一、首先肯定要有html文本,或者html网页。你要生成的pdf是什么样,就用html画一个一样的网页。

     

    二、将html网页转为pdf文档

    https://www.cnblogs.com/liuzheng0612/p/16149034.html

     

    三、打印PDF

    1.引用O2S.Components.PDFRender4NET.dll,在nuget中下载

     2.代码

          /// <summary>
            /// PDFRender4NET打印PDF
            /// </summary>
            /// <param name="filePath">pdf文件完全路径</param>
            /// <param name="printName">打印机名称,不传使用默认打印机</param>
            /// <param name="width">标签宽度mm</param>
            /// <param name="height">标签高度mm</param>
            private static void PDFRender4NETPrint(string filePath, string printName, double width, double height)
            {
                using (PDFFile file = PDFFile.Open(filePath))
                {
                    PrinterSettings settings = new PrinterSettings();
                    settings.PrintToFile = false;
                    if (printName != null)
                    {
                        settings.PrinterName = printName;
                    }
    
                    double proportion = 0.0393701;//1mm等于0.0393701 in
                    width = width * proportion * 100;//乘100,标签大小单位是百分之一英寸
                    height = height * proportion * 100;
    
    
                    //设置纸张大小(可以不设置,取默认设置)3.90 in,  8.65 in
                    PaperSize ps = new PaperSize(printName, Convert.ToInt32(width), Convert.ToInt32(height));
                    //如果是自定义纸张,就要大于118,(A4值为9,详细纸张类型与值的对照请看http://msdn.microsoft.com/zh-tw/library/system.drawing.printing.papersize.rawkind(v=vs.85).aspx)
                    ps.RawKind = 120;
                    O2S.Components.PDFRender4NET.Printing.PDFPrintSettings pdfPrintSettings = new O2S.Components.PDFRender4NET.Printing.PDFPrintSettings(settings);
                    pdfPrintSettings.PaperSize = ps;
    
    
                    pdfPrintSettings.PageScaling = O2S.Components.PDFRender4NET.Printing.PageScaling.FitToPrinterMarginsProportional;
                    pdfPrintSettings.PrinterSettings.Copies = 1;
                    file.Print(pdfPrintSettings);
                    //file.Dispose();
                }
            }

     

  • 相关阅读:
    [leetcode]40. Combination Sum II
    二分法查找,如果找到就返回索引,找不到就返回插入该数后的坐标
    [leetcode]39combinationsum回溯法找几个数的和为目标值
    [leetcode33Search in Rotated Sorted Array]在排序旋转后序列中找目标值
    leetcode Add to List 31. Next Permutation找到数组在它的全排列中的下一个
    3sum
    Security and Risk Management(5)
    Lawrence HDU
    Print Article HDU
    Batch Scheduling POJ
  • 原文地址:https://www.cnblogs.com/liuzheng0612/p/16149259.html
Copyright © 2020-2023  润新知