Java:使用Java调用打印机进行打印(JPG、PDF和Word三种文件格式)

本文介绍了如何使用Java实现JPG、PDF和Word三种文件格式的打印。对于JPG,利用Java原生打印API;PDF通过Apache PDFBox库;Word打印则借助Jacob插件,或转换为PDF后再打印。详细代码示例展示了具体实现过程。
摘要由CSDN通过智能技术生成

目录

一、Java的打印简介

二、Java打印实现

2.1 JPG图片文件格式打印实现

2.2 PDF文件格式打印实现

2.3 Word文件格式打印实现

2.3.1 Word文件采用jacob插件进行打印实现。

2.3.2 先将word转化为pdf文件,然后打印pdf(lz使用)

三、总结


一、Java的打印简介

在我们的实际工作中,经常需要实现打印功能。但由于历史原因,Java 提供的打印功能一直都比较弱。实际上最初的 jdk 根本不支持打印,直到 jdk1.1 才引入了很轻量的打印支持。实际上,SUN 公司也一直致力于 Java 打印功能的完善,而 Java2 平台则终于有了一个健壮的打印模式的开端, jdk1.4 则提供了一套完整的"Java 打印服务 API" (Java Print Service API),它对已有的打印功能是积极的补充。

本次调研的打印对象主要是JPG,PDF和Word这三种常见文件格式。

二、Java打印实现

2.1 JPG图片文件格式打印实现

打印JPG图片格式的文件,本次采用的Java原生的打印方式。

jdk1.4之后对打印功能有了很好的支持。Java 的打印 API 主要存在于 java.awt.print 包中。而 jdk1.4 新增的类则主要存在于 javax.print 包及其相应的子包 javax.print.event 和 javax.print.attribute 中。其中 javax.print 包中主要包含打印服务的相关类,而 javax.print.event 则包含打印事件的相关定义,javax.print.attribute 则包括打印服务的可用属性列表等。可以很好的解决打印JPG图片格式的需求。

优点:jdk的原生支持的打印功能,可直接使用,支持设置各项打印参数。

缺点:局限性较大,只能打印一些图片和文本格式的文件。

具体实现如下:

public static void main(String[] argv) throws Exception {



        File file = new File("E:\\a.jpg");



        String printerName = "HP MFP M436 PCL6";//打印机名包含字串



        PDFPrint(file,printerName);



    }



// 传入文件和打印机名称



public static void JPGPrint(File file,String printerName) throws PrintException {



	if (file == null) {



		System.err.println("缺少打印文件");



	}



	InputStream fis = null;



	try {



		// 设置打印格式,如果未确定类型,可选择autosense



		DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;



		// 设置打印参数



		PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();



		aset.add(new Copies(1)); //份数



		//aset.add(MediaSize.ISO.A4); //纸张



		// aset.add(Finishings.STAPLE);//装订



		aset.add(Sides.DUPLEX);//单双面



		// 定位打印服务



		PrintService printService = null;



		if (printerName != null) {



			//获得本台电脑连接的所有打印机



			PrintService[] printServices = PrinterJob.lookupPrintServices();



			if(printServices == null || printServices.length == 0) {



				System.out.print("打印失败,未找到可用打印机,请检查。");



				return ;



			}



			//匹配指定打印机



			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){



				System.out.print("打印失败,未找到名称为" + printerName + "的打印机,请检查。");



				return ;



			}



		}



		fis = new FileInputStream(file); // 构造待打印的文件流



		Doc doc = new SimpleDoc(fis, flavor, null);



		DocPrintJob job = printService.createPrintJob(); // 创建打印作业



		job.print(doc, aset);



	} catch (FileNotFoundException e1) {



		e1.printStackTrace();



	} finally {



 // 关闭打印的文件流



		if (fis != null) {



			try {



				fis.close();



			} catch (IOException e) {



				e.printStackTrace();



			}



		}



	}



}



}

2.2 PDF文件格式打印实现

在经过网上的查找及对比,我选择了使用Apache PDFbox来实现进行PDF文件格式的打印。

Apache PDFbox是一个开源的、基于Java的、支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容。Apache PDFBox还包含了数个命令行工具。在此,我们只研究打印功能。

优点:功能强大,开源软件,较完美的解决了PDF格式文件的一系列处理,使用方便。

缺点:

具体实现如下:

①直接导入maven依赖:

<dependency>



	<groupId>org.apache.pdfbox</groupId>



	<artifactId>pdfbox</artifactId>



	<version>2.0.6</version>



</dependency>

②代码调用实现

public static void main(String[] args) throws Exception {



        String pdfFile = "E:\\a.pdf";//文件路径



        File file = new File(pdfFile);



        String printerName = "HP MFP M436 PCL6";//打印机名包含字串



        print(file,printerName);



    }



public static void PDFprint(File file ,String printerName) throws Exception {



        PDDocument document = null;



        try {



            document = PDDocument.load(file);



            PrinterJob printJob = PrinterJob.getPrinterJob();



            printJob.setJobName(file.getName());



            if (printerName != null) {



                // 查找并设置打印机



                //获得本台电脑连接的所有打印机



                PrintService[] printServices = PrinterJob.lookupPrintServices();                			 if(printServices == null || printServices.length == 0) {



                    System.out.print("打印失败,未找到可用打印机,请检查。");



                    return ;



                }



                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){



                    printJob.setPrintService(printService);



                }else{



                    System.out.print("打印失败,未找到名称为" + printerName + "的打印机,请检查。");



                    return ;



                }



            }



            //设置纸张及缩放



            PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);



            //设置多页打印



            Book book = new Book();



            PageFormat pageFormat = new PageFormat();



            //设置打印方向



            pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向



            pageFormat.setPaper(getPaper());//设置纸张



            book.append(pdfPrintable, pageFormat, document.getNumberOfPages());



            printJob.setPageable(book);



            printJob.setCopies(1);//设置打印份数



            //添加打印属性



            HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet();



            pars.add(Sides.DUPLEX); //设置单双页



            printJob.print(pars);



        }finally {



            if (document != null) {



                try {



                    document.close();



                } catch (IOException e) {



                    e.printStackTrace();



                }



            }



        }



    }



public static Paper getPaper() {



        Paper paper = new Paper();



        // 默认为A4纸张,对应像素宽和高分别为 595, 842



        int width = 595;



        int height = 842;



        // 设置边距,单位是像素,10mm边距,对应 28px



        int marginLeft = 10;



        int marginRight = 0;



        int marginTop = 10;



        int marginBottom = 0;



        paper.setSize(width, height);



        // 下面一行代码,解决了打印内容为空的问题



        paper.setImageableArea(marginLeft, marginRight, width - (marginLeft + marginRight), height - (marginTop + marginBottom));



        return paper;



    }

2.3 Word文件格式打印实现

打印word这里共使用了2种方法,一种是直接使用jacob进行打印,这种方法打印word我暂时没有找到设置打印参数的相关方式,(但是打印Excle好像设置打印参数没问题,在PrintOut操作里设置,参数具体可参考https://msdn.microsoft.com/zh-cn/vba/excel-vba/articles/worksheets-printout-method-excel),第二种是将word先转成pdf文件,然后进行打印。

2.3.1 Word文件采用jacob插件进行打印实现。

Jacob是一个 Java到微软的com接口的桥梁。使用Jacob允许任何JVM访问com对象,从而使Java应用程序能够调用com对象。如果你要对 Word、Excel 进行处理,Jacob是一个好的选择。

优点:可以很好的处理word文档的相关操作。

缺点:必须手动引入dll文件,暂时未找到方法设置打印相关参数,只能暂时实现静默打印,还需安装office2003以上版本(lz是office365,未激活也可)。

具体实现如下:

①下载jacob.zip ,对应(86/64)的dll文件放在%Java_Home%jre/bin目录下。

下载地址:https://sourceforge.net/projects/jacob-project/

②导入jacob.jar到工程中

在工程中创建lib文件夹保存jacob.jar:reseources—lib—jacob.jar

img

添加Maven依赖:

        <!--添加本地的jacob.jar包-->



		<dependency>



			<groupId>com.jacob</groupId>



			<artifactId>jacob</artifactId>



			<version>1.19</version>



			<scope>system</scope>



		<systemPath>${basedir}/src/main/resources/lib/jacob.jar</systemPath>



		</dependency>

具体代码实现:

public static void main(String[] args) {



        String filePath = "E:\\a.docx";//文件路径



        String printerName = "HP MFP M436 PCL6";//打印机名包含字串



        printWord(filePath,printerName);



    }



 



    public static void printWord(String filePath, String printerName){



//        初始化线程



        ComThread.InitSTA();



        ActiveXComponent word = new ActiveXComponent("Word.Application");



       //设置打印机名称



        word.setProperty("ActivePrinter", new Variant(printerName));



        // 这里Visible是控制文档打开后是可见还是不可见,若是静默打印,那么第三个参数就设为false就好了



        Dispatch.put(word, "Visible", new Variant(false));



        // 获取文档属性



        Dispatch document = word.getProperty("Documents").toDispatch();



        // 打开激活文挡



        Dispatch doc=Dispatch.call(document, "Open", filePath).toDispatch();



        //Dispatch doc = Dispatch.invoke(document, "Open", Dispatch.Method,



              //  new Object[] { filePath }, new int[1]).toDispatch();



        try{



            Dispatch.callN(doc, "PrintOut");



            System.out.println("打印成功!");



        }catch (Exception e){



            e.printStackTrace();



            System.out.println("打印失败");



        }finally {



            try {



                if (doc != null) {



                    Dispatch.call(doc, "Close", new Variant(0));//word文档关闭



                }



            } catch (Exception e2) {



                e2.printStackTrace();



            }



            //退出



            word.invoke("Quit", new Variant[0]);



            //释放资源



            ComThread.Release();



            ComThread.quitMainSTA();



        }



        }

2.3.2 先将word转化为pdf文件,然后打印pdf(lz使用)

优点:可设置打印参数等操作

缺点:也要引入jacob相关依赖和文件

具体实现步骤如下:

①因为转化也是使用jacob插件,所以也需要根据第一种方法一样引入jacob相关依赖和文件

②打印pdf文件时,使用的是上面讲述的pdfbox插件,所以也需要引入pdfbox的依赖

        <dependency>



            <groupId>org.apache.pdfbox</groupId>



            <artifactId>pdfbox</artifactId>



            <version>2.0.6</version>



        </dependency>

③代码具体实现

首先将word文件转化为pdf文件

//word转化pdf,传入转换前的文件路径(例:"E:\\a.docx")和转换后的文件路径(例:"E:\\a.pdf")



    public static void wordToPDF(String sFilePath,String toFilePath) {



        System.out.println("启动 Word...");



        long start = System.currentTimeMillis();



        ActiveXComponent app = null;



        Dispatch doc = null;



        try {



            app = new ActiveXComponent("Word.Application");



            app.setProperty("Visible", new Variant(false));



            Dispatch docs = app.getProperty("Documents").toDispatch();



            doc = Dispatch.call(docs, "Open", sfilePath).toDispatch();



            System.out.println("打开文档:" + sfilePath);



            System.out.println("转换文档到 PDF:" + toFilePath);



            File tofile = new File(toFilePath);



            if (tofile.exists()) {



                tofile.delete();



            }



            Dispatch.call(doc, "SaveAs", toFilePath, // FileName



                    17);//17是pdf格式



            long end = System.currentTimeMillis();



            System.out.println("转换完成..用时:" + (end - start) + "ms.");



 



        } catch (Exception e) {



            System.out.println("========Error:文档转换失败:" + e.getMessage());



        } finally {



            Dispatch.call(doc, "Close", false);



            System.out.println("关闭文档");



            if (app != null)



                app.invoke("Quit", new Variant[]{});



        }



        // 如果没有这句话,winword.exe进程将不会关闭



        ComThread.Release();



    }

然后打印pdf文件(这里传入的文件为上面word转化生成的pdf文件)

//这里传入的文件为word转化生成的pdf文件



public static void PDFprint(File file ,String printerName) throws Exception {



        PDDocument document = null;



        try {



            document = PDDocument.load(file);



            PrinterJob printJob = PrinterJob.getPrinterJob();



            printJob.setJobName(file.getName());



            if (printerName != null) {



                // 查找并设置打印机



                //获得本台电脑连接的所有打印机



                PrintService[] printServices = PrinterJob.lookupPrintServices();                			 if(printServices == null || printServices.length == 0) {



                    System.out.print("打印失败,未找到可用打印机,请检查。");



                    return ;



                }



                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){



                    printJob.setPrintService(printService);



                }else{



                    System.out.print("打印失败,未找到名称为" + printerName + "的打印机,请检查。");



                    return ;



                }



            }



            //设置纸张及缩放



            PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);



            //设置多页打印



            Book book = new Book();



            PageFormat pageFormat = new PageFormat();



            //设置打印方向



            pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向



            pageFormat.setPaper(getPaper());//设置纸张



            book.append(pdfPrintable, pageFormat, document.getNumberOfPages());



            printJob.setPageable(book);



            printJob.setCopies(1);//设置打印份数



            //添加打印属性



            HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet();



            pars.add(Sides.DUPLEX); //设置单双页



            printJob.print(pars);



        }finally {



            if (document != null) {



                try {



                    document.close();



                } catch (IOException e) {



                    e.printStackTrace();



                }



            }



        }



    }



public static Paper getPaper() {



        Paper paper = new Paper();



        // 默认为A4纸张,对应像素宽和高分别为 595, 842



        int width = 595;



        int height = 842;



        // 设置边距,单位是像素,10mm边距,对应 28px



        int marginLeft = 10;



        int marginRight = 0;



        int marginTop = 10;



        int marginBottom = 0;



        paper.setSize(width, height);



        // 下面一行代码,解决了打印内容为空的问题



        paper.setImageableArea(marginLeft, marginRight, width - (marginLeft + marginRight), height - (marginTop + marginBottom));



        return paper;



    }

最后别忘了将生成的pdf文件删除

                File file=new File(toFilePath);



                if(file.exists()&&file.isFile())



                    file.delete();

三、总结

至此,本次实现的JPG、PDF和Word三种文件格式的打印已经全部实现,分别采用了原生打印和PDFbox插件和jacob插件进行实现。记录一下,以防忘记,留待后续使用。

### 回答1: 使用iText打印PDF文件可以通过以下步骤实现: 1. 导入iText库 首先,需要将iText库添加到Java项目中。可以在Maven中添加以下依赖项: ``` <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> ``` 或者可以从iText的官方网站下载库并手动添加到项目中。 2. 创建PDF文档 使用iText创建PDF文档。这可以通过以下代码实现: ``` Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("sample.pdf")); document.open(); document.add(new Paragraph("Hello World!")); document.close(); writer.close(); ``` 这段代码创建一个包含“Hello World!”文本的PDF文档。 3. 打印PDF文件 使用Java的PrintService类来获取系统中的打印机,并使用PdfReader类读取创建的PDF文档。以下代码演示了如何实现: ``` PrintService[] printers = PrintServiceLookup.lookupPrintServices(null, null); PdfReader reader = new PdfReader("sample.pdf"); PrintService printer = printers[0]; // 选择系统中的第一个打印机 DocPrintJob job = printer.createPrintJob(); PdfPrint pdfPrint = new PdfPrint(reader, job); pdfPrint.print(); ``` 这段代码选择系统中的第一个打印机,并使用PdfPrint类来打印PDF文档。注意,在运行此代码之前,确保有打印机可用。 以上是使用iText在Java调用打印机打印PDF文件的基本步骤。您可以根据自己的需求对其进行修改和调整。 ### 回答2: 使用iText调用打印机打印PDF,可以通过以下步骤实现: 1. 首先,确保已经正确安装和配置了iText库,并将其添加到Java项目中的类路径中。 2. 创建一个空白的PDF文档对象,可以使用`PdfWriter`类来实现,通过指定输出流将其与文件关联起来。 3. 使用iText的API来添加文本、图片、表格等内容到PDF文档中。这些内容可以使用`com.itextpdf.text`包中的相应类来创建和设置。 4. 在将PDF文档打印之前,需要首先将其导出为临时文件。可以使用`java.io.File`类来生成一个带有唯一名称的临时文件,并将PDF内容写入该文件。 5. 调用系统的打印机服务,使用Java的`java.awt.Desktop.print(File file)`方法,将PDF文件发送给打印机进行打印。 下面是一个示例代码,演示了如何使用iText将PDF文档打印打印机: ```java import com.itextpdf.text.Document; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter; import java.awt.*; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class PrintPdfWithIText { public static void main(String[] args) { // 创建PDF文档 Document document = new Document(); try { // 绑定到一个临时PDF文件 File outputFile = File.createTempFile("temp", ".pdf"); PdfWriter.getInstance(document, new FileOutputStream(outputFile)); // 打开文档 document.open(); // 添加内容 document.add(new Paragraph("Hello, World!")); // 关闭文档 document.close(); // 打印PDF文件 if (Desktop.isDesktopSupported()) { Desktop.getDesktop().print(outputFile); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } ``` 这是一个简单的示例代码,演示了使用iText创建一个包含"Hello, World!"文本的PDF文档,并将其打印到默认打印机。可以根据具体需求修改和扩展代码。 ### 回答3: Java可以使用iText库来调用打印机打印PDF文件。iText是一个功能强大的Java库,可以用于创建、操纵和处理PDF文档。 使用iText调用打印机打印PDF文件的步骤如下: 1. 首先,需要通过下载iText库的jar文件并将其导入到Java项目中。 2. 创建一个打印任务,并指定要打印PDF文件的路径。可以使用FileInputStream类来读取PDF文件。 3. 创建一个打印机的选择对话框,以显示可用的打印机列表供用户选择。可以使用javax.print包中的类来实现功能。 4. 获取用户选择的打印机,并将其作为参数传递给PrintServiceLookup类的lookupDefaultPrintService方法。 5. 创建一个DocFlavor对象,指定打印的文档类型为PDF。可以使用javax.print包中的DocFlavor类来实现。 6. 创建一个Doc对象,将读取的PDF文件和DocFlavor对象作为参数传递给Doc类的构造函数。 7. 创建一个PrintJob对象,并将打印机和Doc对象作为参数传递给PrintService类的createPrintJob方法。 8. 调用PrintJob对象的print方法,开始进行打印操作。 9. 最后,关闭文件输入流和打印作业。 使用iText库调用打印机打印PDF文件可以实现灵活的打印功能,可以选择不同的打印机和页面设置,同时也能够处理PDF文档的内容和样式。通过iText,Java可以轻松地实现PDF文件的打印操作。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值