[NativeScript中用于PDF打印的Android实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NativeScript中用于PDF打印的Android实现相关的知识,希望对你有一定的参考价值。

在我的NativeScript-Vue应用程序中,我需要将PDF文档打印到蓝牙打印机上,并接收回调,无论打印成功还是取消。插件nativescript-printerios上可以完美处理,但在android上不会返回回调(the feature is not implemented)。该插件使用PrintHelper类,该类具有一个回调,该回调在成功和取消时都会被调用,没有参数和返回值。

似乎唯一的解决方案是通过类PrintManager实现打印。一些来源:

所以这就是我尝试过的。 onWriteonLayout有效,但是onStartonFinish(这是我的目标)从未调用过。

import * as application from "tns-core-modules/application";

function printPdf(pdfFilePath) { // path: "/data/user/0/com.myapp.test/cache/pdf/document1.pdf"
    let printManager = application.android.foregroundActivity.getSystemService(android.content.Context.PRINT_SERVICE);
    let jobName = "PrintPdf";
    let PrintPDFAdapter = android.print.PrintDocumentAdapter.extend({
        onStart() {
            console.log("on start);
        },

        onWrite(pages, destination, cancellationSignal, callback) {
            let input;
            let output;
            try {
                input = new java.io.FileInputStream(new java.io.File(pdfFilePath));
                output = new java.io.FileOutputStream(destination.getFileDescriptor());

                let buf = new Array.create("byte", 1024);
                let bytesRead;
                while ((bytesRead = input.read(buf)) > 0) {
                    output.write(buf, 0, bytesRead);
                }

                callback.onWriteFinished(new android.print.PageRange(0, 0));
            } catch (e){
                console.error(e);
            } finally {
                try {
                    input.close();
                    output.close();
                } catch (e) {
                    console.error(e);
                }
            }
        },

        onLayout(oldAttributes, newAttributes, cancellationSignal, callback, extras){
            try {
                if (cancellationSignal.isCanceled()) {
                    callback.onLayoutCancelled();
                    return;
                }

                let pdi = new android.print.PrintDocumentInfo.Builder("print_output.pdf").setContentType(android.print.PrintDocumentInfo.CONTENT_TYPE_DOCUMENT).build();

                callback.onLayoutFinished(pdi, true);
            } catch (e) {
                console.error(e);
            }
        },

        onFinish() {
            console.log("on finish");
        }
    });

    let pda = new PrintPDFAdapter();

    printManager.print(jobName, pda, null);
}
答案

printManager.print()返回一个PrintJob对象,该对象具有当前的打印状态。不好,但这是我的解决方法:

function printPDF(pdfFilePath) {

    // above code

    let printJob = printManager.print(jobName, pda, null);

    let onFinish = function(status) {
        resolve(status);
        clearInterval(interval);
    }
    let interval = setInterval(() => {
        let state = printJob.getInfo().getState();
        console.log(state);
        if (state === 6) onFinish("print failed");
        if (state === 7) onFinish("print cancelled");
        if (state === 5) onFinish("print completed");
    }, 500);
}

如果PrintJob状态卡在排队或阻塞的情况下,我可能会在间隔上实现超时。

以上是关于[NativeScript中用于PDF打印的Android实现的主要内容,如果未能解决你的问题,请参考以下文章

移动 Safari 中的强制打印对话框用于多页 PDF

[NativeScript] Create new application and run emulator

用于 PDF 导出、Excel 导出和打印的 ReactJS 组件

如何在 Server 2012 中将 Text to PDF 程序配置为打印机以在服务器上用于创建 PDF

一个用于合并pdf的简单Python脚本

在 C# 中打印 Pdf [关闭]