通过PDF文件流,将多个PDF合并成一个PDF,输出文件流,核心代码如下:
需要注意:
ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, new Phrase(addFont(String.format("第" + pages + "页"))), (int)width/2, 20, 0);
该代码中必须是stamp.getOverContent(),否则会造成部分页码打印失败。
/**
* 合并PDF 添加页码
* @Date 2020年4月16日 下午3:07:43
* tag@param files(要合并的PDF流文件)
* tag@return
*/
public static InputStream mergePdfFiles2(List<InputStream> files) {
Document document = null;
InputStream bis = null;
ByteArrayOutputStream bos = null;
try {
Rectangle rect = new Rectangle(PageSize.A4);
document = new Document(rect);
bos = new ByteArrayOutputStream();
PdfCopy copy = new PdfCopy(document, bos);
document.open();
int pages = 0;// 当前页码
for (int i = 0; i < files.size(); i++) {
// 第几个
PdfReader reader = new PdfReader(files.get(i));
PdfCopy.PageStamp stamp;// 插入页码所需 不要页码可删除
int n = reader.getNumberOfPages();
for (int j = 1; j <= n; j++) {
Rectangle pageSize = reader.getPageSize(j);
double width = pageSize.getWidth();
pages++;
document.newPage();
PdfImportedPage page = copy.getImportedPage(reader, j);
stamp = copy.createPageStamp(page);// 插入页码所需 不要页码可删除
//注意必须是stamp.getOverContent()否则部分页码丢失
ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, new Phrase(addFont(String.format("第" + pages + "页"))), (int)width/2, 20, 0);// 插入页码所需
// 不要页码可删除
stamp.alterContents();// 插入页码所需 不要页码可删除
copy.addPage(page);
}
reader.close();
}
copy.close();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} finally {
document.close();
}
bis = new ByteArrayInputStream(bos.toByteArray());
return bis;
}