gpt4 book ai didi

java - 如何在 java pdfbox 中按结果拆分 pdf 文件

转载 作者:搜寻专家 更新时间:2023-11-01 02:06:20 25 4
gpt4 key购买 nike

我有一个 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 等。我怎样才能达到dis。 ..

最佳答案

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 日更新:

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

关于java - 如何在 java pdfbox 中按结果拆分 pdf 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32002830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com