java打印api可以直接打印pdf文件吗

 我来答
kevintop3
2013-08-21 · TA获得超过1.5万个赞
知道小有建树答主
回答量:890
采纳率:100%
帮助的人:537万
展开全部

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

本项目实现解析HTML文件转化成PDF文件,然后调用打印机打印PDF文件并支持横版打印,打印机的选择。。 

项目需要的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();
      }
}

来自http  : /  /  fuchangle.iteye.com/blog/1558749 

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yugi111
2013-08-21 · TA获得超过8.1万个赞
知道大有可为答主
回答量:5.1万
采纳率:70%
帮助的人:1.3亿
展开全部
当然可以,连生成pdf都可以,何况打印呢!
追问
具体要注意什么,我用了, 打印不了..
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式