需求:多个pdf合并成一个pdf
一、pdf合并的类:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.multipdf.PDFMergerUtility;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PdfMergeUtil {
public static void main(String[] args) {
String[] files = { "f:\\word\\pdf\\3.pdf", "f:\\word\\pdf\\4.pdf" };
String savepath = "f:\\word\\pdf\\5.pdf";
Boolean bool = mergePdfFiles(files, savepath);
System.out.println(bool);
}
static Logger logger = LoggerFactory.getLogger(PdfMergeUtil.class);
/*
* 合并pdf文件
* @param files 要合并文件数组(绝对路径如{ "e:\\1.pdf", "e:\\2.pdf" ,
* "e:\\3.pdf"}),合并的顺序按照数组中的先后顺序,如2.pdf合并在1.pdf后。
* @param newfile 合并后新产生的文件绝对路径,如 e:\\temp\\tempNew.pdf,
* @return boolean 合并成功返回true;否则,返回false
*
*/
public static boolean mergePdfFiles(String[] files, String newfile) {
boolean retValue = false;
Document document = null;
try {
document = new Document(new PdfReader(files[0]).getPageSize(1));
PdfCopy copy = new PdfCopy(document, new FileOutputStream(newfile));
document.open();
for (int i = 0; i < files.length; i++) {
PdfReader reader = new PdfReader(files[i]);
int n = reader.getNumberOfPages();
for (int j = 1; j <= n; j++) {
document.newPage();
PdfImportedPage page = copy.getImportedPage(reader, j);
copy.addPage(page);
}
}
retValue = true;
} catch (Exception e) {
logger.error("执行失败:",e);
} finally {
System.out.println("执行结束");
if(document != null) {
document.close();
}
}
return retValue;
}
/**
* @Desciption:多张pdf合并为一张pdf
* @param list 需要合并的输入流集合
* @return 合并后的byte
*/
public static InputStream pdfMergeByInputStream(List<InputStream> list) {
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
PDFMergerUtility mergePdf = new PDFMergerUtility();
// 设置合并生成pdf文件名称
// mergePdf.setDestinationFileName("aa.pdf");
// 添加需要合并的流
mergePdf.addSources(list);
// 设置输入到byte中
mergePdf.setDestinationStream(baos2);;
try {
mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
} catch (IOException e) {
logger.error("合并的流失败:",e);
}
return new ByteArrayInputStream(baos2.toByteArray());
}
/**
* @Desciption:多张pdf合并为一张pdf
* @param list 需要合并的输入流集合
* @return 合并后的byte
*/
public static byte[] pdfMergeByByte(List<InputStream> list) {
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
PDFMergerUtility mergePdf = new PDFMergerUtility();
// 设置合并生成pdf文件名称
// mergePdf.setDestinationFileName("aa.pdf");
// 添加需要合并的流
mergePdf.addSources(list);
// 设置输入到byte中
mergePdf.setDestinationStream(baos2);;
try {
mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
} catch (IOException e) {
logger.error("合并的流失败:",e);
}
return baos2.toByteArray();
}
}
二、项目引入jar包如下:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.19</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
三、我项目里用到了mergePdfFiles这个方法。