PDF分割与合并(充分利用Spire的bug实现操作PDF)

首先声明,文章虽为原创,但使用的代码,可能借鉴其他人的作品,如有侵权请联系删除。

内容主要分三个模块:

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;
    }


}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值