java兑现打印PDF文件解决方案
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
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(); } }