java pdf打印解决方案,将pdf转为图片进行打印

由于部分打印机不识别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轴进行补偿,如发现其他的解决办法还请告知

猜你喜欢

转载自blog.csdn.net/zeratyl/article/details/78593762