妖精的尾巴丶 2023-06-05 10:50 采纳率: 100%
浏览 47
已结题

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


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

  • 写回答

2条回答 默认 最新

  • 妖精的尾巴丶 2023-06-06 13:27
    关注

    啊。。。实在解决不掉,换成另存为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;
        }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月14日
  • 已采纳回答 6月6日
  • 创建了问题 6月5日

悬赏问题

  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
  • ¥15 开发一个类似百度网盘的软件,在主页 文件列表点击进入文件夹,在文件夹里面还有文件夹,代码该怎么写?
  • ¥30 使用matlab将观测点聚合成多条目标轨迹
  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据