package com.qmth.boot.tools.pdf;

import com.lowagie.text.Document;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfSmartCopy;
import com.qmth.boot.tools.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * PDF文档合并工具
 */
public class PdfMergeFile {

    private Document document;

    private PdfSmartCopy copy;

    private OutputStream ous;

    /**
     * 初始化合并文档，并指定输出流
     *
     * @param ous 输出数据流
     */
    public PdfMergeFile(OutputStream ous) {
        this.ous = ous;
    }

    /**
     * 将指定PDF文件合并到当前文档
     *
     * @param ins      待合并PDF文件输入流
     * @param autoFill 是否自动补齐偶数页
     * @return 当前实例用于链式调用
     * @throws IOException
     */
    public PdfMergeFile merge(InputStream ins, boolean autoFill) throws IOException {
        return merge(new PdfReader(ins), autoFill);
    }

    /**
     * 将指定PDF文件合并到当前文档
     *
     * @param data     待合并PDF文件内容
     * @param autoFill 是否自动补齐偶数页
     * @return 当前实例用于链式调用
     * @throws IOException
     */
    public PdfMergeFile merge(byte[] data, boolean autoFill) throws IOException {
        return merge(new PdfReader(data), autoFill);
    }

    private PdfMergeFile merge(PdfReader reader, boolean autoFill) throws IOException {
        // 根据首个pdf文件初始化大小
        if (document == null) {
            Rectangle rect = reader.getPageSize(1);
            document = new Document(rect);
            copy = new PdfSmartCopy(document, ous);
            document.open();
        }
        // 逐页复制
        int n = reader.getNumberOfPages();
        for (int i = 1; i <= n; i++) {
            document.newPage();
            PdfImportedPage page = copy.getImportedPage(reader, i);
            copy.addPage(page);
        }
        // 奇数页自动补齐为偶数
        if (autoFill && n % 2 != 0) {
            document.newPage();
            copy.addPage(reader.getPageSize(1), reader.getPageRotation(1));
        }
        reader.close();
        return this;
    }

    /**
     * 结束合并，关闭当前文档与输出流
     */
    public void close() {
        if (document != null) {
            document.close();
        }
        IOUtils.closeQuietly(ous);
    }
}
