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();
       }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值