由于部分打印机不识别pdf文档,但是大部分的打印机可直接打印图片,故先将文档转为图片,然后进行打印
import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import javax.imageio.ImageIO;
import javax.print.*;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
/**
* @Descriptions:
* @Data: Created in 10:32 2017/11/15/015
*/
public class IcePdfToImage {
public static void main(String[] args) {
try {
printPdfByChangeToImg(new String[]{"E:\\WORK\\TESTDOCUMENT\\1.pdf"});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将pdf转换为图片,然后打印
* @param paths 传入多个pdf路径
* @return
*/
public static boolean printPdfByChangeToImg(String[] paths){
boolean printFlag = false;
Document document = new Document();
// 构建打印请求属性集
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
// 设置打印格式,因为未确定类型,所以选择autosense
DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
// 查找所有的可用的打印服务
PrintService[] printService = PrintServiceLookup.lookupPrintServices(
flavor, pras);
// 如果没有获取打印机
if (printService.length == 0) {
// 终止程序
System.out.println("未安装打印机,请确认安装打印机,并将可用的打印机设为默认打印机");
return false;
}
// 定位默认的打印服务
PrintService defaultService = PrintServiceLookup
.lookupDefaultPrintService();
// 获得打印工作
DocPrintJob job = defaultService.createPrintJob();
DocAttributeSet das = new HashDocAttributeSet();
// das.add(new MediaPrintableArea(10, 10, 590,840, MediaPrintableArea.INCH));
if (paths != null && paths.length > 0){
for (String path : paths){
try {
document.setFile(path);
} catch (PDFException e) {
System.out.println("读取pdf文档错误,请检查路径");
e.printStackTrace();
} catch (PDFSecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
float scale = 4f;
float rotation = 0f;
//纵坐标阴影修正
int yRvise = -3;
for(int i = 0; i < document.getNumberOfPages(); i++){
BufferedImage image = null;
try {
image = (BufferedImage) document.getPageImage(
i, GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX,rotation,scale);
} catch (InterruptedException e) {
e.printStackTrace();
}
RenderedImage rendImage = image;
// 设置打印内容
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
BufferedImage tag = new BufferedImage(
image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(image,0,yRvise,rendImage.getWidth(),rendImage.getHeight()+yRvise,null);
ImageIO.write(rendImage,"png",output);
File file = new File("E:\\WORK\\TESTDOCUMENT\\"+(i+1) + ".png");
ImageIO.write(tag,"png", file);
} catch (IOException e) {
e.printStackTrace();
}
ByteArrayInputStream input = new ByteArrayInputStream(
output.toByteArray());
Doc doc = new SimpleDoc(input, flavor, das);
/* try {
job.print(doc, pras);
} catch (PrintException e) {
e.printStackTrace();
}*/
try {
input.close();
output.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (input != null) input = null;
if (output != null) output = null;
}
image.flush();
}
document.dispose();
}
}
document.dispose();
return printFlag;
}
}
由于文档传图片时图片最上角有条线,通过调试发现为传图片是图片进行了下移,目前还不知道是什么原因造成下移,暂时通过y轴进行补偿,如发现其他的解决办法还请告知