引入jar包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
/**
* 合并PDF* @param PDFone
* @param PDFtwo
* @param PDFfinal
* @throws Exception
*/
public static void mergePDF(String PDFone,String PDFtwo, String PDFfinal) throws Exception{
PdfReader reader1 = new PdfReader(PDFone);
PdfReader reader2 = new PdfReader(PDFtwo);
FileOutputStream out = new FileOutputStream(PDFfinal);
Rectangle rect = new Rectangle(PageSize.A4); //设置页面大小
Document document = new Document(rect);
PdfWriter writer = PdfWriter.getInstance(document, out);
//PdfReportM1HeaderFooter footer=new PdfReportM1HeaderFooter();//添加自定义事件
// writer.setPageEvent(footer); 这两句为添加页码代码,先注释掉,需要另外自定义 PdfReportM1HeaderFooter
document.open();
PdfContentByte cb = writer.getDirectContent();
List<PdfReader> readers = new ArrayList<PdfReader>();
readers.add(reader1);
readers.add(reader2);
int pageOfCurrentReaderPDF = 0;
Iterator<PdfReader> iteratorPDFReader = readers.iterator();
while (iteratorPDFReader.hasNext()) {
PdfReader pdfReader = iteratorPDFReader.next();
while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
pageOfCurrentReaderPDF++;
PdfImportedPage page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);
document.setPageSize(new Rectangle(page.getWidth(), page.getHeight())); //设置页面大小
document.newPage();
cb.addTemplate(page, 0, 0);
}
pageOfCurrentReaderPDF = 0;
}
out.flush();
document.close();
out.close();
}
/**
* 删除指定页
* @param PDFPath PDF路径
* @param pageNum 删除指定页
* @throws Exception
*/
public static void deletePage(String PDFPath,Integer pageNum) throws Exception{
PdfReader reader = new PdfReader(PDFPath);
List<Integer> list = new ArrayList<Integer>();
int numberOfPages = reader.getNumberOfPages();
for (int i = 1; i <=numberOfPages; i++) {
list.add(i);
}
list.remove(pageNum);
reader.selectPages(list);
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("D:\\" + "deletePageTemp.pdf"));
stamp.flush();
stamp.close();
reader.close();
//删除原有文件
File old = new File(PDFPath);
old.delete();
File file = new File("D:\\" + "deletePageTemp.pdf");
file.renameTo(new File(PDFPath));//将生成新文件的位置移动至源文件
}
/**
* PDF指定页插入文件
* @param PDFPath
* @param numPage
* @param insertPath
* @throws Exception
*/
public static void insertPage(String PDFPath,Integer numPage,String insertPath) throws Exception{
PdfReader reader = new PdfReader(PDFPath);
PdfReader readerInsert = new PdfReader(insertPath);
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("D:\\" + "insertPageTemp.pdf"));
PdfWriter writer = stamp.getWriter();
int numberOfPages = readerInsert.getNumberOfPages();
for (int i = 1; i <= numberOfPages; i++) {//循环添加新增文件内容
stamp.insertPage(numPage+i, readerInsert.getPageSize(i));
stamp.getOverContent(numPage+i).addTemplate(writer.getImportedPage(readerInsert, i), 0, 0);
}
stamp.flush();
stamp.close();
reader.close();
readerInsert.close();
File old = new File(PDFPath);
old.delete();//删除原文件
File file = new File("D:\\" + "insertPageTemp.pdf");
file.renameTo(new File(PDFPath));//将生成新文件的位置移动至源文件
}
/**
* 将图片插入指定页
* @param PDFPath PDF路径
* @param numPage 插入指定页
* @param insertPath 图片路径
* @throws Exception
*/
public static void insertImage(String PDFPath,Integer numPage,String insertPath) throws Exception{
PdfReader reader = new PdfReader(PDFPath);
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("D:\\" + "insertImageTemp.pdf"));
Image image = Image.getInstance(insertPath);
float width = image.getWidth();
float height = image.getHeight();
float widthA4 = PageSize.A4.getWidth();
float heightA4 = PageSize.A4.getHeight();
float tw=widthA4/width;
float th=heightA4/height;
float percent=tw<th?tw:th;
image.scalePercent(percent*100);//按照原有比例调整图片大小,适应页面尺寸
//计算图片插入正中央位置
float x=(widthA4-width*percent)/2;
float y=(heightA4-height*percent)/2;
image.setAbsolutePosition(x, y);
stamp.insertPage(numPage+1, new Rectangle(PageSize.A4));
stamp.getOverContent(numPage+1).addImage(image);
stamp.flush();
stamp.close();
reader.close();
}