`

java实现打印PDF文件解决方案

阅读更多
Java print service API本身支持打印, 但其并不具有解释PDF文件的能力,也就是说,用标准的Java Print API能够打印PDF文件, 但所用的打印机必须支持PDF打印标准,即打印机支持Post Script标准, 而这种打印机通常昂贵,目前市场上流通的廉价打印机(使用基于主机的驱动程序)基本不支持,故用Pure Java打印PDF这种想当然的简单事情变得复杂起来, 网上现有的解决方案通常是用OCX或是其它的本地解决方案, 不具有跨平台性,限于Windows平台.   这里介绍一种基于纯Java的产品.
PDF Renderer

本项目实现解析HTML文件转化成PDF文件,然后调用打印机打印PDF文件并支持横版打印,打印机的选择。。
欢迎转载学习,转载时请注明来自http://fuchangle.iteye.com/blog/1558749

项目需要的jar包
core-renderer.jar, iText-2.0.8.jar, iTextAsian.jar,
jsoup-1.6.1.jar,  PDFRenderer-0.9.0.jar

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.nio.ByteBuffer;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;
import com.nudms.server.nurse.servlet.CompressDataServlet;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFRenderer;
/**
 * 打印表单
 * @author fu-changle
 *
 */
public class PrintUtil {
	
	public void printmenu(String urlpath,String filepath, String printName) throws  IOException,DocumentException, PrinterException{
		URL url = new URL(urlpath);
		Document document =Jsoup.parse(url, 100000);
		String html = document.html();
		
		ITextRenderer renderer = new ITextRenderer();
		ITextFontResolver fontResolver = renderer.getFontResolver();    
        fontResolver.addFont(CompressDataServlet.FONTSPATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        
        renderer.setDocumentFromString(html);
        renderer.layout(); 
        
        OutputStream os = new FileOutputStream(filepath);   
        renderer.createPDF(os); 
        os.close();
        
		int j=0;
		PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
		if(services.length == 0){
			System.out.println("not found printer");
		}
		PrinterJob job = PrinterJob.getPrinterJob();
		for(PrintService ps: services){
			if(ps.getName().equals(printName)){
				job.setPrintService(services[j]);
			}else {
				j++;
			}
		}
		
		FileInputStream fis = new FileInputStream(filepath);
		byte[] pdfContent = new byte[fis.available()];
		fis.read(pdfContent, 0, fis.available());
		ByteBuffer buf = ByteBuffer.wrap(pdfContent);
		PDFFile pdfFile = new PDFFile(buf);
		
		Book bk = new Book();
		
		int num = pdfFile.getNumPages();
		for(int i=0; i<num; i++){
			PDFPage page = pdfFile.getPage(i+1);
			PageFormat pf = job.defaultPage();
			bk.append(new MyPDFPrintPage(page), pf);
			
			Paper paper = pf.getPaper();
			double x = 0;
			double y = 0; 
			
			if(page.getAspectRatio()<1){
				double width = page.getBBox().getWidth();
				double height = page.getBBox().getHeight();
				
				paper.setImageableArea(x, y, width, height);
				
				pf.setOrientation(PageFormat.PORTRAIT);
			}else{
				
				double width = page.getBBox().getHeight();
				double height = page.getBBox().getWidth();
				
				paper.setImageableArea(x, y, width, height);
				
				pf.setOrientation(PageFormat.LANDSCAPE);
			}
			pf.setPaper(paper);
			System.out.println();
		}
		job.setPageable(bk);
	    job.setJobName("My book");
	    try {
	        job.print();
	      } catch (Exception e) {
	    	  e.printStackTrace();
	      }
		}
4
2
分享到:
评论
6 楼 hy18710385392 2014-10-23  
亲:
import com.nudms.server.nurse.servlet.CompressDataServlet;这是那个包导入的?
new MyPDFPrintPage类没有啊!
老大求帮助!
5 楼 osacar 2014-10-16  
MyPDFPrintPage这个类能提供下?
4 楼 lohasle 2013-08-15  
liangzb0614 写道
你好,求一个MyPDFPrintPage 类!谢谢你

同求参考下。
3 楼 liangzb0614 2013-07-09  
你好,求一个MyPDFPrintPage 类!拜托了
liangzb0614@gmail.com
2 楼 liangzb0614 2013-07-09  
你好,求一个MyPDFPrintPage 类!谢谢你
1 楼 HyEidolon 2012-10-24  
CompressDataServlet cannot be resolved
MyPDFPrintPage cannot be resolved to a type
少了代码 

相关推荐

    java 打印pdf文件 也可批量打印

    ### Java打印PDF文件及批量打印实现 #### 一、引言 在企业级应用开发中,经常需要处理各种文档操作,其中包括PDF文件的打印。Java作为一种广泛应用的企业级开发语言,提供了多种方式来实现这一功能。本文将详细...

    Java实现PDF格式文件打印必备软件.zip

    在Java环境中,我们可以利用GSview的API(如果有的话)或者通过调用系统命令来启动GSview并打印PDF文件。例如,通过`Runtime.getRuntime().exec()`方法执行GSview的命令行参数,将PDF文件路径和打印指令传递给它。 ...

    Java实现PDF打印的解决方案

    Java实现PDF打印的解决方案 在本文中,我们将探讨Java实现PDF打印的解决方案,包括Java Print Service、Apache PDFBox、Adobe Reader命令打印和Linux打印四种方法。 1. Java Print Service Java Print Service是...

    PDF文件编辑打印解决方案

    其次,打印PDF文件在JAVA中可以使用Java Print Service API。这个API允许开发者控制打印任务,包括选择打印机、设置打印参数等。以下是一个简单的示例,展示如何使用JAVA打印PDF: ```java File file = new File(...

    直接打印PDF文件,不弹出打印设置窗口

    在IT行业中,PDF(Portable Document...总的来说,直接打印PDF文件而不弹出设置窗口涉及到对PDF阅读器、编程接口、自动化工具以及企业级解决方案的深入理解。通过选择合适的方法,我们可以提高工作效率,优化打印流程。

    JAVASE通过调用接口获取PDF文件并对PDF分割并打印,PDF不支持直接打印必须先转成JPG再打印

    在Java SE(标准版)开发中,处理PDF文件并实现打印功能是一项常见的需求。本案例主要探讨了如何通过调用接口来获取PDF文件,然后对其进行分割,并将分割后的页面转换为JPG图像以便进行打印。这里我们将详细讲解涉及...

    纯java代码跨平台调用打印机打印word、pdf、图片等。

    1. **PDF处理**:`pdfbox-2.0.2.jar`是Apache PDFBox库的一个版本,它提供了处理PDF文件的能力。PDFBox提供了API来读取、创建和修改PDF文档。在打印过程中,可能使用了`PDDocument`类来加载PDF,`PDFRenderer`类将...

    JAVA实现多页PDF转一张长图图片

    若要处理这种情况,可能需要寻找其他解决方案,如使用支持这类元素的第三方库,或者在转换后手动添加水印和图章。 后端代码通常会涉及接收PDF文件,执行转换操作,然后返回结果图像。这可能涉及到文件上传、文件...

    Java开发的发票打印

    Java的`Apache PDFBox`库或者`iText`库可以帮助读取和操作PDF文件,以便进行打印。这些库提供了API来添加、修改或提取PDF文档的内容。 5. **模板设计**:为了实现自定义打印,可以创建一个模板设计,然后根据实际...

    多种office文件转换为pdf文件的java解决方案.zip

    这个"多种office文件转换为pdf文件的java解决方案.zip"压缩包显然包含了一个名为DocumentConvertor.java的源代码文件,可能是实现这个功能的核心类。下面将详细介绍相关的Java技术及其可能的实现方式。 1. **Apache...

    Java实现Web报表打印功能.

    iText作为一款强大的PDF处理库,为Web应用中的报表打印提供了灵活且高效的解决方案。无论是直接编程生成还是利用模板填充,iText都能满足不同场景下的需求,成为Java开发者实现报表打印的理想选择。通过本文的探讨,...

    JAVA仿百度文库预览PDF文件绝对好用

    这个项目“JAVA仿百度文库预览PDF文件绝对好用”就是这样的一个解决方案,它允许用户在Web端预览PDF文档,类似于百度文库的功能。 首先,让我们了解PDF和SWF格式。PDF(Portable Document Format)是一种通用的文件...

    Lodop与java结合使用打印功能

    Lodop与Java的结合使用,为实现高效、灵活的打印解决方案提供了一种有效途径,特别是对于条码打印这种需求。以下是对这个主题的详细阐述: Lodop(乐度云打印服务)是一款专业的网页打印控件,它提供了丰富的API...

    japser实现批量打印

    总的来说,JasperReports和iReport的组合为开发者提供了一套强大的报表解决方案,不仅可以用于单一报表的生成,还支持大规模的数据处理和批量打印。通过学习和实践,开发者能够灵活地满足各种复杂的打印需求。

    Java实现将html转PDF

    本项目提供了一个Java实现HTML转PDF的解决方案,适用于Eclipse开发环境。 1. **Java与PDF库** Java中用于生成PDF的库有很多,如iText、Flying Saucer、PDFBox等。其中,Flying Saucer是一个常用的库,它可以将HTML...

    jsp在线浏览pdf文件的jar包和插件

    在JavaWeb开发中,有时我们需要实现用户在浏览器中...总的来说,"jsp在线浏览pdf文件的jar包和插件"提供的解决方案大大简化了JavaWeb应用中PDF预览的实现,只需简单集成和少量代码,就能在浏览器中流畅地查看PDF文件。

    Java语言中实现打印功能的分析与应用.pdf

    首先,Java自带的API是实现打印功能的基础,随着J2SE的发布,Java打印服务API为开发者提供了新的打印支持。这一API突破了早期java.print包的PrintService和DocPrintJob接口的局限性,提供了更为丰富的打印功能。实现...

    基于Java的多样化打印解决方案设计源码

    该解决方案提供基于Java的多功能打印服务,涵盖PDF、Word、图片和Jasperreports模板等多种打印格式,源码包含22个文件,包括6个Java源文件、3个JAR包、2个属性文件、2个DLL文件、1个Git忽略文件、1个Markdown文档、1...

    java打印功能开发手册.pdf

    ### Java打印功能开发手册知识点详解 #### 一、引言 在Java的发展历程中,打印功能一直是相对薄弱的一环。最初版本的Java甚至不支持任何打印功能,直到Java 1.1才引入了`PrintJob`类,但这仅仅提供了一个非常基础...

Global site tag (gtag.js) - Google Analytics