代码之家  ›  专栏  ›  技术社区  ›  User9999

如何在javapdfbox中按结果分割pdf文件

  •  4
  • User9999  · 技术社区  · 9 年前

    我有一个pdf文件,包含60页。在每一页中,我都有唯一且重复的发票号,我使用的是Apache PDFBOX。

    import java.io.*;
    import org.apache.pdfbox.pdmodel.*;
    import org.apache.pdfbox.util.*;
    import java.util.regex.*;
    
    public class PDFtest1 {
    public static void main(String[] args){
    PDDocument pd;
    try {
    
         File input = new File("G:\\Sales.pdf");
    
         // StringBuilder to store the extracted text
         StringBuilder sb = new StringBuilder();
         pd = PDDocument.load(input);
         PDFTextStripper stripper = new PDFTextStripper();
    
         // Add text to the StringBuilder from the PDF
         sb.append(stripper.getText(pd));
    
    
         Pattern p = Pattern.compile("Invoice No.\\s\\w\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d");
    
         // Matcher refers to the actual text where the pattern will be found
         Matcher m = p.matcher(sb);
    
         while (m.find()){
             // group() method refers to the next number that follows the pattern we have specified.
             System.out.println(m.group());
         }
    
         if (pd != null) {
             pd.close();
         }
       } catch (Exception e){
         e.printStackTrace();
        }
     }
     }  
    

    我能够使用java正则表达式读取所有发票号。 最后,结果如下

    run:
    Invoice No. D0000003010
    Invoice No. D0000003011
    Invoice No. D0000003011
    Invoice No. D0000003011
    Invoice No. D0000003011
    Invoice No. D0000003012
    Invoice No. D0000003012
    Invoice No. D0000003012
    Invoice No. D0000003013
    Invoice No. D0000003013
    Invoice No. D0000003014
    Invoice No. D0000003014
    Invoice No. D0000003015
    Invoice No. D0000003016
    

    我需要根据发票号拆分pdf。例如,发票号D0000003011,所有pdf页面应合并为一个pdf,依此类推。 我怎样才能做到这一点。。

    1 回复  |  直到 9 年前
        1
  •  6
  •   Tilman Hausherr    9 年前
    public static void main(String[] args) throws IOException, COSVisitorException
    {
        File input = new File("G:\\Sales.pdf");
    
        PDDocument outputDocument = null;
        PDDocument inputDocument = PDDocument.loadNonSeq(input, null);
        PDFTextStripper stripper = new PDFTextStripper();
        String currentNo = null;
        for (int page = 1; page <= inputDocument.getNumberOfPages(); ++page)
        {
            stripper.setStartPage(page);
            stripper.setEndPage(page);
            String text = stripper.getText(inputDocument);
            Pattern p = Pattern.compile("Invoice No.(\\s\\w\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d)");
    
            // Matcher refers to the actual text where the pattern will be found
            Matcher m = p.matcher(text);
            String no = null;
            if (m.find())
            {
                no = m.group(1);
            }
            System.out.println("page: " + page + ", value: " + no);
    
            PDPage pdPage = (PDPage) inputDocument.getDocumentCatalog().getAllPages().get(page - 1);
    
            if (no != null && !no.equals(currentNo))
            {
                saveCloseCurrent(currentNo, outputDocument);
                // create new document
                outputDocument = new PDDocument();
                currentNo = no;
            }
            if (no == null && currentNo == null)
            {
                System.out.println ("header page ??? " + page + " skipped");
                continue;
            }
            // append page to current document
            outputDocument.importPage(pdPage);
        }
        saveCloseCurrent(currentNo, outputDocument);
        inputDocument.close();
    }
    
    private static void saveCloseCurrent(String currentNo, PDDocument outputDocument)
            throws IOException, COSVisitorException
    {
        // save to new output file
        if (currentNo != null)
        {
            // save document into file
            File f = new File(currentNo + ".pdf");
            if (f.exists())
            {
                System.err.println("File " + f + " exists?!");
                System.exit(-1);
            }
            outputDocument.save(f);
            outputDocument.close();
        }
    }
    

    小心:

    • 这还没有用你的文件测试过(因为我没有);
    • 代码假设相同的发票号码总是在一起;
    • 您的正则表达式略有更改;
    • 确保第一个和最后一个PDF文件是正确的,并随机检查几个,如果可用,还可以使用不同的查看器;
    • 验证文件总数是否符合预期;
    • 所有文件的总大小将大于源文件,这是因为字体资源;
    • 使用1.8.10版本。不要同时使用PDFBox 0.7.3.jar!
    • 错误处理是非常基本的,您需要更改它;

    2015年8月19日更新:

    • 它现在支持没有发票号的页面,这些页面将被追加。