首先声明,文章虽为原创,但使用的代码,可能借鉴其他人的作品,如有侵权请联系删除。
内容主要分三个模块:
1:将需要处理的PDF文件分割为10页的多个PDF
2:使用冰蓝的包(spire)对分割后的PDF进行处理
本人处理的是pdf按照当前纸张规则进行PDF缩放
3:将处理的PDF文件进行合并
代码如下:
ClassName{
public static void main(String... args) throws Exception, DocumentException {
// read original pdf file
String filename = "F:\\test\\pdf\\7A3030F2-6D57.pdf";
String mergeFile = "F:\\test\\pdf\\7A3030F2-6D57-merge.pdf";
new SplitPDF().scalePDF(filename);
/*File file = new File(filename);
String newFolder = file.getParent();
String mergeFile = newFolder+"\\mergeFile.pdf";
newFolder = newFolder+"\\mergetest";
File folder =new File(newFolder);
if (!folder.exists() && !folder.isDirectory())
folder.mkdir();
String folderName = "F:\\test\\pdf\\merge";
String folderName2 = "F:\\test\\pdf\\split";
String dest = "F:\\test\\pdf\\merge2\\mergeAAAAAA.pdf";
delAllFile(newFolder);
new SplitPDF().Split(filename,newFolder);
new SplitPDF().scale(newFolder);
new SplitPDF().merger(newFolder,filename,mergeFile);*/
}
/**
* 整体文件缩放缩放pdf
*
* @param filename
* @return
*/
public Boolean scalePDF(String filename) {
//filename = filename.substring(1,filename.length());
File file = new File(filename);
String newFolder = file.getParent();
String mergeFile = newFolder + "\\mergeFile.pdf";
newFolder = newFolder + "\\mergetest";
File folder = new File(newFolder);
if (!folder.exists() && !folder.isDirectory())
folder.mkdir();
delAllFile(newFolder);
try {
new SplitPDF().Split(filename, newFolder);
new SplitPDF().scale(newFolder);
new SplitPDF().merger(newFolder, filename, mergeFile);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* pdf分割
* @param filename
* @param path
*/
public void Split(String filename, String path) {
PdfReader reader = null;
try {
reader = new PdfReader(filename);
// get number of pages
int n = reader.getNumberOfPages();
System.out.println("Number of pages: " + n);
// loop over all pages
int i = 0;
//向上取整
double before = Math.ceil(n / 10.0);
int after = n % 10;
for (int i1 = 0; i1 < before; i1++) {
String destination = path + "\\bufferfile-" + String.format("%03d", i1 + 1) + ".pdf";
Document document = new Document(reader.getPageSizeWithRotation(1));
PdfCopy copy = new PdfCopy(document, new FileOutputStream(destination));
document.open();
PdfImportedPage page = null;
int begin = 0;
int end = 0;
if ((i1 + 1) * 10 > n) {
end = n;
begin = i1 * 10;
} else {
begin = i1 * 10;
end = i1 * 10 + 10;
}
for (int i2 = begin; i2 < end; ) {
page = copy.getImportedPage(reader, ++i2);
copy.addPage(page);
}
document.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) reader.close();
}
}
/**
* pdf合并
* @param folderName
* @param filename
* @param destination
*/
public void merger(String folderName, String filename, String destination) {
ArrayList<String> files = new ArrayList<String>();
List<String> list = folderIter(folderName, files);
PdfReader reader2 = null;
Document document = null;
PdfCopy copy = null;
try {
reader2 = new PdfReader(filename);
document = new Document(reader2.getPageSizeWithRotation(1));
copy = new PdfCopy(document, new FileOutputStream(destination));
PdfImportedPage page = null;
document.open();
for (String s : list) {
PdfReader reader = new PdfReader(s);
int numberOfPages = reader.getNumberOfPages();
for (int i = 0; i < numberOfPages; ) {
page = copy.getImportedPage(reader, ++i);
copy.addPage(page);
}
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e){
e.printStackTrace();
} finally{
if (copy != null)
copy.close();
if (reader2 != null)
reader2.close();
if (document != null)
document.close();
}
}
public Boolean scale(String path) {
ArrayList<String> files = new ArrayList<String>();
List<String> list = folderIter(path, files);
try {
for (String s : list) {
pdfPrint(s);
}
}catch (Exception e){
e.printStackTrace();
return false;
}
return true;
}
/**
* 文件夹遍历拿到文件名
* @param path
* @param fileNameList
* @return
*/
public List<String> folderIter(String path, ArrayList<String> fileNameList) {
//ArrayList<String> files = new ArrayList<String>();
boolean flag = false;
File file = new File(path);
File[] tempList = file.listFiles();
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile()) {
// System.out.println("文 件:" + tempList[i]);
//fileNameList.add(tempList[i].toString());
fileNameList.add(path + "\\" + tempList[i].getName());
}
if (tempList[i].isDirectory()) {
// System.out.println("文件夹:" + tempList[i]);
folderIter(tempList[i].getAbsolutePath(), fileNameList);
}
}
return fileNameList;
}
/**
* pdf缩放
* @param filepath
* @throws Exception
*/
public void pdfPrint(String filepath) throws Exception{
//创建PdfDocument对象
PdfDocument originalDoc = new PdfDocument();
originalDoc.loadFromFile(filepath);
//创建一个新的PdfDocument实例
PdfDocument newDoc = new PdfDocument();
//遍历所有PDF 页面
Dimension2D dimension2D = new Dimension();
for (int i = 0; i < originalDoc.getPages().getCount(); i++) {
PdfPageBase page = originalDoc.getPages().get(i);
double higth1 = page.getSize().getHeight();
double width1 = page.getSize().getWidth();
PdfPageRotateAngle rotation = page.getRotation();
//如果宽度比高度大纸还大,就是横板/否则就是竖版
int value = rotation.getValue();
String name = rotation.getName();
boolean rotate = false;
float width = (float) page.getSize().getWidth();
float height = (float) page.getSize().getHeight();
if (rotation.getValue() == 1 || rotation.getValue() == 3) {
rotate = false;
width = (float) page.getSize().getHeight();
height = (float) page.getSize().getWidth();
} else {
rotate = true;
}
float allLength = width + height;
Boolean A3 = false;
Boolean A4 = false;
if (allLength > 1300 && allLength < 1500) {
A4 = true;
A3 = false;
} else if (allLength > 1900 && allLength < 2100) {
A4 = false;
A3 = true;
}
if (A4) {
//A4纸横板,同时纸张未经过90度旋转
if (width1 > higth1 && rotate) {
PdfMargins margins = new PdfMargins(0);
//设置新文档第二页的页面大小为A2
dimension2D.setSize(width, height);
PdfPageBase newPage = newDoc.getPages().add(PdfPageSize.A4, margins, PdfPageRotateAngle.Rotate_Angle_0, PdfPageOrientation.Landscape);
//调整画布,设置内容也根据页面的大小进行缩放
double wScale = (PdfPageSize.A4.getWidth()) / PdfPageSize.A4.getWidth();
double hScale = (PdfPageSize.A4.getHeight() - 40) / PdfPageSize.A4.getHeight();
newPage.getCanvas().scaleTransform(wScale, hScale);
//复制原文档的内容到新文档
newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
} else {
PdfMargins margins = new PdfMargins(0);
//设置新文档第二页的页面大小为A2
dimension2D.setSize(width, height);
PdfPageBase newPage = newDoc.getPages().add(dimension2D, margins);
//调整画布,设置内容也根据页面的大小进行缩放
double wScale = (PdfPageSize.A4.getWidth() - 40) / PdfPageSize.A4.getWidth();
double hScale = (PdfPageSize.A4.getHeight()) / PdfPageSize.A4.getHeight();
newPage.getCanvas().scaleTransform(wScale, hScale);
//复制原文档的内容到新文档
newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
}
} else if (A3) {
if (width1 > higth1 && rotate) {
PdfMargins margins = new PdfMargins(0);
//设置新文档第二页的页面大小为A2
dimension2D.setSize(width, height);
PdfPageBase newPage = newDoc.getPages().add(PdfPageSize.A3, margins, PdfPageRotateAngle.Rotate_Angle_0, PdfPageOrientation.Landscape);
//调整画布,设置内容也根据页面的大小进行缩放
double wScale = (PdfPageSize.A3.getWidth()) / PdfPageSize.A3.getWidth();
double hScale = (PdfPageSize.A3.getHeight() - 40) / PdfPageSize.A3.getHeight();
newPage.getCanvas().scaleTransform(wScale, hScale);
//复制原文档的内容到新文档
newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
} else {
PdfMargins margins = new PdfMargins(0);
//设置新文档第二页的页面大小为A2
dimension2D.setSize(width, height);
PdfPageBase newPage = newDoc.getPages().add(dimension2D, margins);
//调整画布,设置内容也根据页面的大小进行缩放
double wScale = (PdfPageSize.A3.getWidth() - 40) / PdfPageSize.A3.getWidth();
double hScale = (PdfPageSize.A3.getHeight()) / PdfPageSize.A3.getHeight();
newPage.getCanvas().scaleTransform(wScale, hScale);
//复制原文档的内容到新文档
newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
}
} else {
//A4纸横板,同时纸张未经过90度旋转
if (width1 > higth1 && rotate) {
PdfMargins margins = new PdfMargins(0);
//设置新文档第二页的页面大小为A2
dimension2D.setSize(width, height);
PdfPageBase newPage = newDoc.getPages().add(dimension2D, margins, PdfPageRotateAngle.Rotate_Angle_0, PdfPageOrientation.Landscape);
//调整画布,设置内容也根据页面的大小进行缩放
double wScale = (width1) / width1;
double hScale = (higth1 - 40) / higth1;
newPage.getCanvas().scaleTransform(wScale, hScale);
//复制原文档的内容到新文档
newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
} else {
PdfMargins margins = new PdfMargins(0);
//设置新文档第二页的页面大小为A2
dimension2D.setSize(width, height);
PdfPageBase newPage = newDoc.getPages().add(dimension2D, margins);
//调整画布,设置内容也根据页面的大小进行缩放
double wScale = (width1 - 40) / width1;
double hScale = (higth1) / higth1;
newPage.getCanvas().scaleTransform(wScale, hScale);
//复制原文档的内容到新文档
newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
}
}
//纸张切割
if (false) {
//设置新文档第二页的页边距为10
PdfMargins margins = new PdfMargins(0);
//设置新文档第二页的页面大小为A2
dimension2D.setSize(width, height);
PdfPageBase newPage = newDoc.getPages().add(dimension2D, margins);
//调整画布,设置内容也根据页面的大小进行缩放
double wScale = (PdfPageSize.A4.getWidth() - 40) / PdfPageSize.A4.getWidth();
double hScale = (PdfPageSize.A4.getHeight()) / PdfPageSize.A4.getHeight();
newPage.getCanvas().scaleTransform(wScale, hScale);
//复制原文档的内容到新文档
newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
}
newDoc.saveToFile(filepath);
}
newDoc.close();
originalDoc.close();
//originalDoc.close();
}
//删除文件夹
//param folderPath 文件夹完整绝对路径
public static void delFolder(String folderPath) {
try {
delAllFile(folderPath); //删除完里面所有内容
String filePath = folderPath;
filePath = filePath.toString();
java.io.File myFilePath = new java.io.File(filePath);
myFilePath.delete(); //删除空文件夹
} catch (Exception e) {
e.printStackTrace();
}
}
//删除指定文件夹下所有文件
//param path 文件夹完整绝对路径
public static boolean delAllFile(String path) {
boolean flag = false;
File file = new File(path);
if (!file.exists()) {
return flag;
}
if (!file.isDirectory()) {
return flag;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
} else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
//先删除文件夹里面的文件
delAllFile(path + "/" + tempList[i]);
//再删除空文件夹
delFolder(path + "/" + tempList[i]);
flag = true;
}
}
return flag;
}
}