Апплет не может печатать, даже если в политике Java разрешена печать

У меня есть веб-приложение, использующее PHP. Одной из функций является автоматическая печать квитанции на двух или более принтерах напрямую без запроса диалогового окна принтера. Я закодировал апплет, как показано ниже, и он печатает непосредственно на любом принтере, указанном в коде.

import javax.swing.JApplet;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import javax.print.PrintService;
import com.sun.pdfview.PDFFile;
import javax.swing.JOptionPane;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFRenderer;

public class PDFApplet extends JApplet {
    private PrinterJob pjob = null;
    //Called when this applet is loaded into the browser.
    public void init() {
        try { 
            FileInputStream fis = new FileInputStream("C:\\app\\receipt.pdf");
            byte[] pdfContent = new byte[fis.available()];
            fis.read(pdfContent, 0, fis.available());
            initialize(pdfContent, "Test Print PDF");

            //PDFApplet printPDFFile = new PDFApplet(fis, "Test Print PDF");
            print();
        } catch (Exception e) {}
    }

    private void initialize(byte[] pdfContent, String jobName) throws IOException, PrinterException {
        ByteBuffer bb = ByteBuffer.wrap(pdfContent);
        // Create PDF Print Page
        PDFFile pdfFile = new PDFFile(bb);
        PDFPrintPage pages = new PDFPrintPage(pdfFile);

        // Create Print Job
        pjob = PrinterJob.getPrinterJob();
        PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
        pjob.setJobName(jobName);
        Book book = new Book();
        book.append(pages, pf, pdfFile.getNumPages());
        pjob.setPageable(book);

        // to remove margins
        Paper paper = new Paper();
        paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight());
        pf.setPaper(paper);
    }

    public void print() throws PrinterException {
        String argPrintServiceName = "HP LaserJet Professional P1102";

        // Send print job to default printer
        PrintService[] printServices = PrinterJob.lookupPrintServices();
        int i;
        for (i = 0; i < printServices.length; i++) {
                if (printServices[i].getName().equalsIgnoreCase(argPrintServiceName)) {
                pjob.setPrintService(printServices[i]);
                break;
            }
        }
        if (i == printServices.length) {
            //throw new PrinterException("Invalid print service name: " + argPrintServiceName);
            JOptionPane.showMessageDialog(this, "Cannot print to " + argPrintServiceName);
        }

        pjob.print();
    }    
}

Однако, когда я вставляю его на html-страницу, апплет больше не печатается. Я добавил необходимые разрешения на печать в java.policy, но он все еще не печатает. Как я могу решить эту проблему, так как это заняло у меня уже около недели.

Спасибо, Сэм


person samuel tetteh-nartey    schedule 06.03.2012    source источник


Ответы (1)


Подпишите апплет цифровой подписью, используя сертификат, аутентифицированный доверенным центром (например, Verisign). Он предложит пользователю, он может выбрать «всегда доверять», и после этого апплет сможет выполнять печать без запроса и без дальнейшего вмешательства пользователя (при условии, что код не вызывает диалоговое окно печати).

person Andrew Thompson    schedule 06.03.2012