0

我目前正在实施 Android PrintService,它能够通过热敏打印机打印 PDF。我设法使用 PDFRenderer 将 PDF 转换为位图,甚至可以打印文档。

问题是,文档(位图)不是全页宽度。

我收到了 297x420 分辨率的文档,并且我使用的是 58 毫米纸张的打印机。

这就是我处理文档的方式(用 C# 编写,使用 Xamarin):

// Create PDF renderer
var pdfRenderer = new PdfRenderer(fileDescriptor);  

// Open page
PdfRenderer.Page page = pdfRenderer.OpenPage(index);

// Create bitmap for page
Bitmap bitmap = Bitmap.CreateBitmap(page.Width, page.Height, Bitmap.Config.Argb8888);

// Now render page into bitmap
page.Render(bitmap, null, null, PdfRenderMode.ForPrint);

然后,将位图转换为 ESC/POS:

// Initialize result
List<byte> result = new List<byte>();

// Init ESC/POS
result.AddRange(new byte[] { 0x1B, 0x33, 0x21 });

// Init ESC/POS bmp commands (will be reapeated)
byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x01, (byte)(bitmap.Width % 256), (byte)(bitmap.Height / 256) };

// Iterate height
for (int i = 0; i < (bitmap.Height / 24 + 1); i++)
{
    // Add bitmapp commands to result
    result.AddRange(escBmp);

    // Init pixel color
    int pixelColor;

    // Iterate width
    for (int j = 0; j < bitmap.Width; j++)
    {
        // Init data
        byte[] data = new byte[] { 0x00, 0x00, 0x00 };

        for (int k = 0; k < 24; k++)
        {
            if (((i * 24) + k) < bitmap.Height)
            {
                // Get pixel color
                pixelColor = bitmap.GetPixel(j, (i * 24) + k);

                // Check pixel color
                if (pixelColor != 0)
                {
                    data[k / 8] += (byte)(128 >> (k % 8));
                }
            }
        }

        // Add data to result
        result.AddRange(data);
    }

    // Add some... other stuff
    result.AddRange(new byte[] { 0x0D, 0x0A });
}

// Return data
return result.ToArray();

当前结果如下所示: 在此处输入图像描述

谢谢大家。

4

1 回答 1

2

ESC/POS 命令集中没有神奇的“缩放到页面宽度”命令,您需要知道打印机的最大宽度,可在手册中找到,然后您可以:

  • 某些图像输出命令的宽度和高度加倍- 您正在使用ESC *,它支持低密度,但高度和宽度以不同的比例变化。
  • 开始时使 PDF 更宽 - 将位图大小与打印机页面宽度匹配,而不是与 PDF 页面宽度匹配。在PDFrenderer 将比例设置为屏幕时解决了相同的问题
  • 如果您对低质量感到满意,您也可以在发送之前简单地拉伸图像。请参阅:如何在 Android 中调整位图的大小?

另外,您的ESC *实现不正确。宽度有两个字节 - 检查 ESC/POS 手册以了解正确用法,或阅读我在另一个问题中链接的 PHP 或 Python 中的正确实现:ESC POS command ESC* for printing bit image on printer

于 2018-05-30T11:54:20.167 回答