pdf转Image 使用itextpdf、pdfbox

maven依赖:

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.4</version>
        </dependency>

 

Java代码块:

package com.testdemo.util;

import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;


/***
 * PDF转图片
 *
 */
public class PdfToImage {


/***
     * pdf转图片并返回图片路径
     * @param filePath pdf路径
     * @param page 转前几页的图片
     * @return List<String>
     */

    public static List<String> pdfToImagePath(String filePath, int page) {
        List<String> list = new ArrayList<>();
        String fileDirectory = filePath.substring(0, filePath.lastIndexOf("."));//获取去除后缀的文件路径
        String imagePath = null;
        PDDocument doc = null;
        clearPasswordUsed(filePath, "/home/cpm/"+filePath);
        try {
            File f = new File(fileDirectory);
            if (!f.exists()) {
                f.mkdir();
            }
            doc = PDDocument.load(new File(filePath));
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            if (pageCount > page) {
                pageCount = page;
            }
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 100); //第二个参数越大生成图片分辨率越高,转换时间也就越长
                imagePath = fileDirectory + "/" + i + ".jpg";
                ImageIO.write(image, "PNG", new File(imagePath));
                list.add(imagePath);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (doc != null) {
                try {
                    doc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }


/***
     * pdf文件免密
     * @param pdfPath 原文件路径
     * @param pdfPath2 新文件路径(不能覆盖原文件路径,否则文件内容会有错误)
     */

    public static void clearPasswordUsed(String pdfPath,String pdfPath2) {
        PdfReader pdfReader = null;
        PdfStamper stamper = null;
        try {
            pdfReader = new PdfReader(pdfPath);
            //得到写的权限
            Field field = pdfReader.getClass().getDeclaredField("ownerPasswordUsed");
            field.setAccessible(true);//修改私有或者受保护的成员变量
            field.setBoolean(pdfReader, true);//免密
            stamper = new PdfStamper(pdfReader, new FileOutputStream(pdfPath2));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stamper != null) {
                try {
                    stamper.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (pdfReader != null) {
                pdfReader.close();
            }
        }
    }

    public static Rectangle getPDfProperty(String pdfFilePath) {
        PdfReader reader = null;
        Rectangle rectangle = null;
        try {
            reader = new PdfReader(pdfFilePath);
            rectangle = reader.getPageSize(1);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                reader.close();
            }
        }
        return rectangle;
    }
}

 

package com.testdemo.biz;

import com.hikvision.common.enums.BooleanEnum;
import com.hikvision.common.enums.SignatureScopeEnum;
import com.hikvision.common.enums.SignatureTypeEnum;
import com.hikvision.model.vo.SignatureVo;
import com.hikvision.util.FileSuffixUtil;
import com.hikvision.util.PdfToImage;
import com.itextpdf.text.Rectangle;
import com.timevale.esign.sdk.tech.bean.PosBean;
import com.timevale.esign.sdk.tech.bean.SignPDFFileBean;
import com.timevale.esign.sdk.tech.bean.result.FileDigestSignResult;
import com.timevale.esign.sdk.tech.impl.constants.SignType;
import com.timevale.esign.sdk.tech.service.SelfSignService;
import com.timevale.esign.sdk.tech.service.UserSignService;
import com.timevale.esign.sdk.tech.v3.client.ServiceClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * 电子签章Service
 * @Author:billjc24.hik
 * @Date:2018年8月7日
 */
@Slf4j
@Service
public class SignatureBiz {

    /**
     * 账户
     */
    @Value("${signature.accountId}")
    private String accountId;
    /**
     * 印章Id
     */
    @Value("${signature.sealId}")
    private String sealId;
    /**
     * 印章base64数据
     */
    @Value("${signature.sealData}")
    private String sealData;
    /**
     * 关键字
     */
    @Value("${signature.keyWord}")
    private String keyWord;

    @Autowired
    private ServiceClient serviceClient;

    public FileDigestSignResult doSignature(SignatureVo signatureVo) {
        //签章文件Bean
        SignPDFFileBean signPDFFileBean;
        //签章参数Bean
        PosBean posBean;
        //第二次签章参数Bean
        PosBean posBean2;
        //签章类型
        SignType signType = null;
        //签章结果
        FileDigestSignResult signResult;
        //pdf文件长宽
        Rectangle rectangle = PdfToImage.getPDfProperty(signatureVo.getFilePath());
        signPDFFileBean = new SignPDFFileBean();
        posBean = new PosBean();
        posBean2 = new PosBean();

        //原文件路径
        signPDFFileBean.setSrcPdfFile(signatureVo.getFilePath());
        //新文件路径
        signPDFFileBean.setDstPdfFile(signatureVo.getFilePath());

        //pdf长度低于1000,印章大小设置为159px
        if(rectangle.getWidth()<=1000){
            posBean.setWidth(159F);
        }else{
            posBean.setWidth(rectangle.getWidth()*0.18F);
        }
        posBean2.setWidth(posBean.getWidth());

        //定位类型(关键字签章时为1)
        posBean.setPosType(0);
        posBean2.setPosType(0);
        if (SignatureTypeEnum.KEYWORK.getCode().equals(signatureVo.getSignatureType())) {
            signType = SignType.Key;
            posBean.setPosType(1);
            posBean.setKey(keyWord);
            return localSignPDF(signPDFFileBean, posBean, signType, accountId, sealId, sealData);
        } else if (SignatureTypeEnum.PAGE.getCode().equals(signatureVo.getSignatureType())) {
            signType = SignType.Multi;
            posBean.setPosPage("0");
            posBean.setPosX(rectangle.getWidth()/2);
            posBean.setPosY(rectangle.getHeight()/2);
            return localSignPDF(signPDFFileBean, posBean, signType, accountId, sealId, sealData);
        } else if (SignatureTypeEnum.SEAM.getCode().equals(signatureVo.getSignatureType())) {
            //尾页
            posBean.setPosType(0);
            posBean.setPosPage("-1");
            posBean.setPosX(rectangle.getWidth()/2);
            posBean.setPosY(rectangle.getHeight()/2);
            signResult = localSignPDF(signPDFFileBean, posBean, SignType.Single, accountId, sealId,
                    sealData);
            if (signResult.getErrCode() != 0) {
                signatureVo.setSignResult(signResult);
                return signResult;
            }

            //骑缝
            posBean2.setPosPage("0");
            posBean2.setPosY(100);
            posBean2.setPosY(PdfToImage.getPDfProperty(signPDFFileBean.getSrcPdfFile()).getHeight() / 2);
            //针对需要连续多次签章的,SignPDFFileBean需要重新创建一个,否则第二次签章后的文件没有第一次签章的数据
            SignPDFFileBean signPDFFileBean2 = new SignPDFFileBean();
            signPDFFileBean2.setSrcPdfFile(signPDFFileBean.getSrcPdfFile());
            signPDFFileBean2.setDstPdfFile(signPDFFileBean.getDstPdfFile());
            return localSignPDF(signPDFFileBean2, posBean2, SignType.Edges, accountId, sealId,
                    sealData);
        } else if (SignatureTypeEnum.MANUAL.getCode().equals(signatureVo.getSignatureType())) {
            //指定位置
            if (StringUtils.isNotEmpty(signatureVo.getPosition())) {
                String[] pos = StringUtils.split(signatureVo.getPosition(), ",");
                //获取pdf长宽
                float width = rectangle.getWidth();
                float height = rectangle.getHeight();
                //按百分比加上印章长度
                posBean.setPosX(width / 100 * Integer.parseInt(pos[0]) + posBean.getWidth() / 2 - 15);
                posBean.setPosY(height / 100 * Integer.parseInt(pos[1]) + posBean.getWidth() / 2 - 15);
            }
            //签章页面范围
            if (SignatureScopeEnum.ALL.getCode().equals(signatureVo.getScope())) {
                signType = SignType.Multi;
                posBean.setPosPage("0");
            } else if (SignatureScopeEnum.LAST.getCode().equals(signatureVo.getScope())) {
                signType = SignType.Single;
                posBean.setPosPage("-1");
            } else if (SignatureScopeEnum.PAGE.getCode().equals(signatureVo.getScope())) {
                signType = SignType.Multi;
                posBean.setPosPage(signatureVo.getPageStart() + "-" + signatureVo.getPageEnd());
            }
            signResult = localSignPDF(signPDFFileBean, posBean, signType, accountId, sealId,
                    sealData);
            if (signResult.getErrCode() != 0) {
                return signResult;
            }

            //骑缝
            if (BooleanEnum.TRUE.getCode().equals(signatureVo.getPagingSeal())) {
                posBean2.setPosPage("0");
                posBean2.setPosY(PdfToImage.getPDfProperty(signPDFFileBean.getSrcPdfFile()).getHeight() / 2);
                SignPDFFileBean signPDFFileBean2 = new SignPDFFileBean();
                signPDFFileBean2.setSrcPdfFile(signPDFFileBean.getSrcPdfFile());
                signPDFFileBean2.setDstPdfFile(signPDFFileBean.getDstPdfFile());
                return localSignPDF(signPDFFileBean2, posBean2, SignType.Edges, accountId,
                        sealId, sealData);
            }
        }
        return null;

    }

    /***
     * 签章
     * @param signPDFFileBean pdf文件Bean
     * @param posBean 印章位置Bean
     * @param signType 签章类型
     * @param accountId 客户Id
     * @param sealId 印章Id
     * @param sealData 印章base64数据
     * @return FileDigestSignResult
     */
    private FileDigestSignResult localSignPDF(SignPDFFileBean signPDFFileBean,
            PosBean posBean, SignType signType, String accountId, String sealId, String sealData) {
        if (StringUtils.isNotEmpty(sealId)) {
            SelfSignService selfSignService = serviceClient.selfSignService();
            return selfSignService.localSignPdf(signPDFFileBean, posBean, Integer.parseInt(sealId), signType);
        } else {
            UserSignService userSignService = serviceClient.userSignService();
            return userSignService.localSignPDF(accountId, sealData, signPDFFileBean, posBean, signType);
        }
    }

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值