pdf拼接

多个pdf流文件拼接

import com.lowagie.text.Document;
import java.util.Iterator;
import java.util.List;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 〈一句话功能简述〉<br> 
 * 〈pdf拼接〉
 */
public final class ConcatPdfUtil {
    private ConcatPdfUtil() {
        throw new IllegalStateException("ConcatPdfUtil class");
    }
    private static final Logger LOGGER = LoggerFactory.getLogger(ConcatPdfUtil.class);
    public static final int NUMBER_OF_FONTSIZE = 9;
    public static final float NUMBER_OF_TEXT_X = 520;
    public static final float NUMBER_OF_TEXT_Y= 5;
    public static final float NUMBER_OF_ROLATION= 0;
    public static final int NUMBER_OF_INIT= 0;

    /**
     * PDF流拼接
     * @param pdfs pdf流集合
     * @param outputStream 输出流
     * @param paginate 是否分页
     */
    public static void concatPDFs(List<InputStream> pdfs, OutputStream outputStream, boolean paginate) {
        Document document = new Document();
        InputStream pdf = null;
        try {
            List<PdfReader> readers = new ArrayList<PdfReader>();
            int totalPages = NUMBER_OF_INIT;
            Iterator<InputStream> iteratorPDFs = pdfs.iterator();
            // 创建pdf
            while (iteratorPDFs.hasNext()) {
                pdf = iteratorPDFs.next();
                PdfReader pdfReader = new PdfReader(pdf);
                readers.add(pdfReader);
                totalPages += pdfReader.getNumberOfPages();
            }
            createPdf( readers, document, outputStream, totalPages, paginate);
            if (outputStream != null) {
                outputStream.flush();
            }
            document.close();
            outputStream.close();
            pdf.close();
        } catch (Exception e) {
            LOGGER.error("拼接pdf失败",e);
        } finally {
            if (document.isOpen()){
                document.close();
            }
            for(InputStream inputStream:pdfs){
                try {
                    if (inputStream != null) {
                        inputStream.close();
                    }
                } catch (IOException ioe) {
                    LOGGER.error("ioe输入流关闭失败",ioe);
                }
            }
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                if(pdf!=null){
                    pdf.close();
                }
            } catch (IOException ioe) {
                LOGGER.error("ioe输出流关闭失败",ioe);
            }
        }
    }
    private static void createPdf(List<PdfReader> readers,Document document,
                                  OutputStream outputStream,int totalPages,
                                  boolean paginate) throws DocumentException, IOException {
        // 创建输出流
        PdfWriter writer = PdfWriter.getInstance(document, outputStream);
        document.open();
        BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,
                BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
        PdfContentByte cb = writer.getDirectContent();
        // 创建pdf信息
        PdfImportedPage page;
        int currentPageNumber = NUMBER_OF_INIT;
        int pageOfCurrentReaderPDF = NUMBER_OF_INIT;
        Iterator<PdfReader> iteratorPDFReader = readers.iterator();
        // 循环pdf
        while (iteratorPDFReader.hasNext()) {
            PdfReader pdfReader = iteratorPDFReader.next();
            //为新的pdf创建页
            while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
                document.newPage();
                pageOfCurrentReaderPDF++;
                currentPageNumber++;
                page = writer.getImportedPage(pdfReader,
                        pageOfCurrentReaderPDF);
                cb.addTemplate(page, NUMBER_OF_ROLATION, NUMBER_OF_ROLATION);
                // 分页编码
                if (paginate) {
                    cb.beginText();
                    cb.setFontAndSize(bf, NUMBER_OF_FONTSIZE);
                    cb.showTextAligned(PdfContentByte.ALIGN_CENTER, ""
                                    + currentPageNumber + " / " + totalPages, NUMBER_OF_TEXT_X,
                            NUMBER_OF_TEXT_Y, NUMBER_OF_ROLATION);
                    cb.endText();
                }
            }
            pageOfCurrentReaderPDF = NUMBER_OF_INIT;
        }
    }
}
在这里插入代码片 
<dependency>
        <groupId>com.lowagie</groupId>
        <artifactId>itext</artifactId>
        <version>4.2.2</version>
        <type>jar</type>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <artifactId>bcmail-jdk14</artifactId>
                <groupId>bouncycastle</groupId>
            </exclusion>
            <exclusion>
                <artifactId>bcprov-jdk14</artifactId>
                <groupId>bouncycastle</groupId>
            </exclusion>
        </exclusions>
        </dependency>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值