Jacob打印并设置打印参数

使用jacob打印并设置打印参数:

com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: PrintOut
Description: 80020005 / 类型不匹配。

无论我的参数怎么调整,他都提示我的类型不匹配,我就想设置一下打印的范围啊,怎么就这么难QAQ

我的代码:

Dispatch.call(printDoc, "PrintOut", new Variant[] {
                    new Variant(false), new Variant(false), new Variant(3), new Variant(false) ,
                    new Variant(1),new Variant(2)});

img


严格按照这个来设置的啊,有人知道原因吗??

啊。。。实在解决不掉,换成另存为pdf,使用pdfbox打印了
下面写一下实现思路:
JACOB:保存为pdf文件

Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[]{newFilePath, new Variant(17)}, new int[1]);
         //17是pdf格式

下面是打印思路:
俩个jar包:pdfbox-2.0.4.jar;fontbox-2.0.4.jar
打印代码:

private static boolean doPrintWordBdPdf(String printFile,String printerName,int fromPage,int toPage){
        boolean printFlag = true;
        PDDocument document = null;
        File file;
        try {
            file = new File(printFile + ".pdf");
            if (file == null || !file.exists()) {
                System.out.println("要打印的PDF文件不存在!");
                return false;
            }
            document = PDDocument.load(file);
            PrinterJob printerJob = PrinterJob.getPrinterJob();
            printerJob.setJobName(file.getName());
            if (printerName != null) {
                // 查找并设置打印机
                //获得本台电脑连接的所有打印机
                PrintService[] printServices = PrinterJob.lookupPrintServices();
                if (printServices == null || printServices.length == 0) {
                    System.out.print("打印失败,未找到可用打印机,请检查。");
                    return false;
                }
                PrintService printService = null;
                //匹配指定打印机
                for (int i = 0; i < printServices.length; i++) {
                    System.out.println(printServices[i].getName());
                    if (printServices[i].getName().contains(printerName)) {
                        printService = printServices[i];
                        break;
                    }
                }
                if (printService != null) {
                    printerJob.setPrintService(printService);
                } else {
                    System.out.print("打印失败,未找到名称为" + printerName + "的打印机,请检查。");
                    return false;
                }
            }
            //设置纸张及缩放
            PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);
            //设置多页打印
            Book book = new Book();
            PageFormat pageFormat = new PageFormat();
            //设置打印方向
            pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向
            Paper paper = getPaper();
            pageFormat.setPaper(paper);
            book.append(pdfPrintable, pageFormat, document.getNumberOfPages());
            printerJob.setPageable(book);
            printerJob.setCopies(1);//设置打印份数
            //添加打印属性
            HashPrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
            attributes.add(Sides.ONE_SIDED); //设置单双页 DUPLEX
            attributes.add(MediaSizeName.ISO_A4);//默认A4纸打印
            attributes.add(MediaSizeName.ISO_A4);//默认A4纸打印
            attributes.add(new PageRanges(fromPage,toPage));//范围
            printerJob.print(attributes);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        } finally {
            if (document != null) {
                try {
                    document.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return printFlag;
    }

    private static Paper getPaper() {
        Paper paper = new Paper();
        // 默认为A4纸张,对应像素宽和高分别为 595, 842
        int width = 595;
        int height = 842;
        // 设置边距,单位是像素,10mm边距,对应 28px
        int marginLeft = 12;
        int marginRight = 12;
        int marginTop = 12;
        int marginBottom = 12;
        paper.setSize(width, height);
        // 下面一行代码,解决了打印内容为空的问题
        paper.setImageableArea(marginLeft, marginRight, width - (marginLeft + marginRight), height - (marginTop + marginBottom));
        return paper;
    }