Archivo pdf de factura de Android (con firma) a imagen de mapa de bits

1. Antecedentes

Recientemente, existe una demanda de una función de autoservicio de impresión de facturas. Una vez completada la transacción del cliente, la factura se puede imprimir mediante facturación de autoservicio con el código QR. Luego de que la facturación sea exitosa, se generará un archivo pdf (con firma).

La impresora que acoplamos utiliza directamente el archivo pdf para imprimir, y la impresión fallará debido al problema de tamaño, por lo que el archivo pdf se convierte en una imagen para imprimir (principalmente porque la impresora es barata y todos la entienden).

Hay un problema aquí. Si lee directamente los datos del archivo y los convierte en una imagen, los datos de la firma se perderán. Busqué en Internet, pero no encontré una solución y el tiempo es un poco escaso, así que Aquí hay algunos trucos: use AndroidPdfViewer para cargar el archivo pdf, luego guarde el contenido del control como un mapa de bits y luego convierta la imagen a negro y profundice el color de la fuente para imprimir.

2. Implementado aquí usando Java

El siguiente es el código de implementación principal.

2.1 El control AndroidPdfViewer carga el archivo pdf de la factura
// invoucePdf为AndroidPdfViewer控件,com.github.barteksc.pdfviewer.PDFView
// 设置控件渲染内容保存到缓存中生成bitmap,下面这两个方法已经过时,有需要可以查看方法源码获取
invoicePdf.setDrawingCacheEnabled(true);
invoicePdf.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
// 这里可以直接获取图片, 这里图片的宽高跟控件的宽高一样
Bitmap invoiceBitmap = invoicePdf.getDrawingCache();

// https://github.com/barteksc/AndroidPdfViewer
invoicePdf.fromFile(file)
    .enableAnnotationRendering(true)  // 调用该方法设置为true,将签章渲染出来
    .load();

// 获取PDFView控件的渲染截图
Bitmap invoiceBitmap;
// bmWidth, bmHeight为图片的宽高,根据实际情况设置
invoiceBitmap = Bitmap.createBitmap(bmWidth, bmHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(invoiceBitmap);
invoicePdf.draw(canvas);
2.2 Convierta la imagen a negro y oscurezca la fuente (para una impresión más clara)
private Bitmap convertBitMap2Black(Bitmap invoiceBitmap) {
    
    

    int width = invoiceBitmap .getWidth();
    int height = invoiceBitmap .getHeight();

    int[] pixels = new int[width * height];

    // 从发票图片中获取对应像素
    invoiceBitmap .getPixels(pixels, 0, width, 0, 0, width, height);

    for (int i=0; i < height; i++) {
    
    
        for (int j=0; j<width; j++) {
    
    
            int pixel = pixels[width * i + j];

            // 根据RGB位置,移位获取对应的像素值
            int red = ((pixel  & 0x00FF0000 ) >> 16);
            int green = ((pixel & 0x0000FF00) >> 8);
            int blue = (pixel & 0x000000FF);

            // 像素值越大,表示颜色越淡,若图片像素内容小于0xB0(该值可变),直接将该像素点置为黑色
            if (red < 0xB0 || green < 0xB0 || blue < 0xB0) {
    
    
                pixels[width * i + j] = 0xFF000000;
            }
        }
    }
    
    // 保存用于打印的黑白图片
    Bitmap  printBitMap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    printBitMap.setPixels(pixels, 0, width, 0, 0, width, height);
    
    return printBitMap;

Supongo que te gusta

Origin blog.csdn.net/qq_36224961/article/details/128327841
Recomendado
Clasificación