【问题标题】:Android implementation for PDF printing in NativeScriptNativeScript中PDF打印的Android实现
【发布时间】:2020-04-08 21:44:35
【问题描述】:

在我的 NativeScript-Vue 应用程序中,我需要将 PDF 文档打印到蓝牙打印机并接收打印成功或取消的回调。插件 nativescript-printer 在 iOS 上完美处理它,但在 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);
}

【问题讨论】:

  • 你没有创建Adapter实例,试试printManager.print(jobName, new pda(), null);
  • 更新问题。它可以工作,但永远不会调用 onFinish()onStart()

标签: android nativescript


【解决方案1】:

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 状态卡在排队或阻塞状态,我可能会在间隔上实现超时。

【讨论】:

    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多