`

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编辑PDF文件、调用打印机打印PDF文件

    PDF文件JAVA去水印源码-PDF-Converter-Services-Online:使用基于REST的云服务转换、合并、水印、安全和OC

    PDF文件JAVA去水印源码Muhimbi PDF Converter 在线服务 关于 这是一项基于 REST 的服务,可以轻松地将文档转换、合并、水印、保护和光学字符识别 (OCR) 添加到大多数编程语言、操作系统和开发平台。 此服务也可作为...

    JSPrintManager:先进的Java客户端打印和扫描解决方案

    JSPrintManager从Javascript打印命令和文件,管理打印机和扫描文档是针对客户端打印和扫描方案的Javascript + Client App解决方案,旨在用于在任何Web平台(如ASP.NET,PHP,Django,Ruby On Rails(RoR),Express....

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    最新Java面试宝典pdf版

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    智能制造专家-智能工厂解决方案.pdf

    通过元动作,为配置计算、现场管控、接口处理和告警等,配置后台处理程序,并配合DRO实现复杂报表和打印。 MQX是企业信息和物联总线,消息和文件的发布和订阅,严格的安全验证,可靠的一次必达包括网络故障和宕机,...

    Java EE Web开发实例精解完整光盘

     除了对JAVA EE Web编程基本技术的讲解淙外,还针对Web应用开发中如打印、图表、日志、上传、下载和国际化等常见功能特性的实现,综合运用多种JAVA EE开发技术,提出多种解决方案,并深入讲座分析,对开发人员动手...

    Java面试宝典2010版

    2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证...

    优道pdf保护控件

    优道科技提供在线文档版权保护技术和解决方案,支持保护通过网页进行在线浏览的PDF和XPS文档。控件采用优道科技独创的屏幕黑洞技术进行研发,能完美解决PDF和XPS文档的在线版权保护问题。ActiveX技术支持无缝嵌入到...

    快逸报表4.0免费版

    快逸报表4.0 Free版提供完备的打印解决方案,实现套打、一纸多页、强制分页、不足补空行等中国式的精确打印需求。 Java版Excel、即时连接数据库、零代码制表、发布、多种统计图、精确完备的报表打印控件、...

    Eclipse权威开发指南3.pdf

    2.3.8 打印..... 49 2.4 Eclipse定制...... 49 2.4.1 透视图..... 49 2.4.2 渐进显示..... 51 2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 ...

    Eclipse权威开发指南1.pdf

    2.3.8 打印..... 49 2.4 Eclipse定制...... 49 2.4.1 透视图..... 49 2.4.2 渐进显示..... 51 2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 ...

    Eclipse权威开发指南2.pdf

    2.3.8 打印..... 49 2.4 Eclipse定制...... 49 2.4.1 透视图..... 49 2.4.2 渐进显示..... 51 2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 2.4.6 在...

Global site tag (gtag.js) - Google Analytics