将 PDF 文档打印到 esc/pos 热敏打印机

2024-04-11

我们正在使用 xamarin.forms 开发 POS APP,因为我们需要将收据打印到通过 LAN 连接的 esc/pos 热敏打印机。 我们的应用程序支持多语言,通过更改代码页使用 esc/pos 命令打印多种语言效果非常好。 但它仅适用于某些受支持的语言,对于其他语言,它会打印垃圾字符(不可读的字符)。

所以我们想到为收据创建一个 pdf 格式并打印出来。我们尝试创建 pdf,然后转换为位图,然后使用 esc pos 命令发送到打印机,但它不打印任何内容。

    public BitImage(String filename)
    {
        Java.IO.File file = new Java.IO.File(filename);
        var pdfRenderer = new PdfRenderer(ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly));
        PdfRenderer.Page page = pdfRenderer.OpenPage(0);
        Bitmap bmp = Bitmap.CreateBitmap(page.Width, page.Height, Bitmap.Config.Argb8888);
        page.Render(bmp, null, null, PdfRenderMode.ForPrint);
        load(bmp);
    }


private void load(Bitmap bmp)
{
    int w = bmp.Width;
    int h = bmp.Height;

    int bw = (w + 7) / 8;
    if (bw > 255)
        bw = 255;

    int bh = h / 8;
    if (bh > 24)
    {
        bh = 24;
    }

    initData(bw * 8, bh * 8);

    for (int y = 0; y < h; y++)
    {
        for (int x = 0; x < w; x++)
        {
            if (bmp.GetPixel(x, y) == Color.Black)
                setPixel(x, y);
        }
    }
}

private void initData(int w, int h)
{
    width = w;
    height = h;
    pitch = h / 8;
    data = new byte[w * pitch];
}

private void setPixel(int x, int y)
{
    if (x >= width || y >= height)
    {
        return;
    }
    int mask = (0x0080 >> (y % 8));
    data[(x * pitch) + (y / 8)] |= (byte)mask;
}


public void PrintData() 
{
    byte[] CMD_INIT = { 0x1B, 0x40 };
    byte[] CMD_UPLOAD_IMAGE = { 0x1D, 0x2A, 0, 0 };
    byte[] CMD_PRINT_IMAGE = { 0x1D, 0x2F, 0 };
    byte[] CMD_CUT = { 0x1D, 0x56, 0x01 };
    CMD_UPLOAD_IMAGE[2] = (byte)(width / 8);
    CMD_UPLOAD_IMAGE[3] = (byte)(height / 8);

    #region Print Via Lan
    Socket pSocket = new Socket(SocketType.Stream, ProtocolType.IP);
    pSocket.SendTimeout = 1500;
    pSocket.Connect("192.168.15.168", 9100);
    pSocket.Send(CMD_INIT);
    pSocket.Send(CMD_UPLOAD_IMAGE);
    pSocket.Send(data);
    pSocket.Send(CMD_PRINT_IMAGE);
    pSocket.Send(CMD_CUT);
    pSocket.Close();
    #endregion
}

请帮助我,我是否以正确的方式做? 或者有没有更好的方法来做同样的事情?


您可以使用 SkiaSharp 等库以任何语言从数据制作图像/PDF,并使用任何打印机正确打印它们。

我创建了一个示例来演示如何使用 C# 中的 ESC\POS 打印机正确打印图像:GitHub 代码仓库 https://github.com/MoienTajik/EscPrinterSample

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 PDF 文档打印到 esc/pos 热敏打印机 的相关文章

随机推荐

  • MOVE-TO 期望输入是代理,但得到的是 NOBODY

    我的代码所做的是设置一个内部灰色补丁区域和一个外部黑色补丁区域 海龟可以在其中繁殖 每个补丁上有一个 一旦乌龟到达灰色和黑色区域之间的边界 我就会分配可变能量 以将乌龟的繁殖延迟一定的刻度 每个刻度能量增长一个单位 当能量达到一定数量时 我
  • 无法编译使用 boost 中的 odeint 的 C++

    我使用的是 Ubuntu 12 04 并且 usr include 中已经有一些 boost fies 我做了一个 sudo apt get install libboost all dev 并且还安装了很多文件 我不想删除这个 boost
  • 多个 JSlider 相互反应始终等于 100%

    我正在尝试向 java swing 应用程序添加 3 个 JSlider 以便三个滑块的总价值总和为 100 每个滑块都是一个概率 滑块 A 是将值添加到队列的概率 滑块 B是从队列中删除某个值的概率 滑块 C 是什么都不发生的概率 示例
  • img 标签中的 SVG 未在 Firefox 中作为图像加载

    我正在尝试使用 img 标签加载我的 svg 文件 但它在 Firefox 上不起作用 Chrome 显示 svg 我正在尝试这样做http www schepers cc svg blendups embedding html http
  • matplotlib 颜色条不起作用(由于垃圾收集?)

    我有一个与此类似的绘图功能 def fct f figure ax f add subplot 111 x y mgrid 0 5 0 5 z sin x 2 y 2 ax pcolormesh x y z 当我在中定义上面的函数时ipyt
  • iPhone 应用程序:应用程序进入 App Store 之前在特定设备上进行 Beta 测试

    我在App程序门户中注册了2台设备 只有我有一台 Mac 和设备才能下载该应用程序进行测试 另一个用户没有 Mac 但他有一部 iPhone 其他用户是否可以下载该应用程序进行测试 以便我们可以在将该应用程序发布到 App Store 上供
  • 根据日期条件之间另一列中的条件计算唯一文本值

    我需要的是根据 FIAP Medium Year 列的标准计算 TITLE 中唯一值的公式 这需要首先查看工作表 M Year 列中的日期 范围为2013年3月23日 2016年6月1日 然后需要检查 I FIAP Medium 列来寻找
  • AWS Lambda 与依赖项打包

    进一步概述是在 NodeJS 和 Monorepo 基于 Lerna 的背景下进行的 我有 AWS 堆栈 其中通过 AWS CloudFormation 部署了多个 AWS Lambda 一些 lambda 很简单 单个小模块 并且可以内联
  • iPhone/iPad:如何以编程方式获取屏幕宽度?

    您好 我想知道是否有办法以编程方式获取宽度 我正在寻找足够通用的东西来容纳 iphone 3gs iphone 4 ipad 此外 宽度应根据设备是纵向还是横向 对于 ipad 进行更改 有人知道该怎么做吗 我已经找了一段时间了 谢谢 看一
  • NHibernate:无法解析继承的 id 属性

    我定义了以下实体 public class Foo Entity
  • C# 裁剪然后缩放裁剪后的图像

    我正在尝试构建此类 在 ASP NET 站点中使用 它将裁剪给定自定义宽度 高度 X Y 的图像 然后获取结果图像并将其缩放为自定义宽度 高度 并保存在服务器返回该图像的 url 我将在查询字符串中获取这些参数 如下所示 Default a
  • 在python中将标题写入excel文件

    如何循环遍历列表中的每个元素并将其作为 Excel 标题 如果有重复的问题 请告诉我 到目前为止我还没找到 row 0 col 0 j 0 title No Hue Saturation Value Lightness AComponent
  • 过滤 ObservableCollection?

    当我将 ListBox 直接绑定到 ObservableCollection 时 我会在 ListBox 中显示实时更新 但是一旦我在混合中添加其他 LINQ 方法 我的 ListBox 就不再收到 ObservableCollection
  • 如何告诉 CPAN make 和 cc 的路径

    使用 opencsw org 软件包在 Solaris 上运行 Perl 5 10 CPAN 软件包中的 Makefile PL 无法找到正确的路径和 cc gcc 我找到了make的路径并将其设置为gmake 但我找不到cc的任何设置 我
  • bash while 循环没有按预期工作

    我知道从技术上讲 它可能会按原样工作 并且这是人们所期望的bash语言 但这不是我所期望和写的 我试图让一切尽可能简单 This is fileA Name Status Networks Image Plans HostName A PA
  • Google App Engine 数据存储区索引上限

    有人可以用简单的英语解释一下数据存储中 5000 个索引的上限吗 这是否意味着存储对象的索引列表属性不能包含超过 5000 个元素 数据存储区限制单个实体可以拥有的索引条目数量 此限制设置为每个实体 5000 个元素 您可以使用以下命令轻松
  • Julia - 迭代字典中的键组合

    有没有一种巧妙的方法来迭代字典中的键组合 我的字典有这样的值 1 gt 1 2 2 3 gt 15 3 gt 6 7 8 4 9 11 gt 3 我需要做的是获取所有长度的键组合1 n where n可能是FX 3 就像上面的例子一样 我想
  • java.sql.SQLFeatureNotSupportedException:方法 org.postgresql.jdbc4.Jdbc4Connection.isValid(int) 尚未实现。在Spring引导中

    我正在开发Spring Boot Microservices例子 在这个例子中 我使用了config server and licensing service并成功部署于docker 当我调用 REST 端点时 http localhost
  • java.lang.RuntimeException:在 android.media.MediaRecorder.start(本机方法)处启动失败

    我正在处理电话录音 当我开始录制电话时 不幸的是它停止了 它给出错误 MediaRecorder 启动失败 2147483648 我请告诉我我的代码有什么问题 这是我的代码 public class incomingcall extends
  • 将 PDF 文档打印到 esc/pos 热敏打印机

    我们正在使用 xamarin forms 开发 POS APP 因为我们需要将收据打印到通过 LAN 连接的 esc pos 热敏打印机 我们的应用程序支持多语言 通过更改代码页使用 esc pos 命令打印多种语言效果非常好 但它仅适用于