Parsing 将从PDF解析的文本与PDFBox匹配

Parsing 将从PDF解析的文本与PDFBox匹配,parsing,text,pdfbox,matching,Parsing,Text,Pdfbox,Matching,这与其说是一个问题,不如说是一门学问。我最近正在努力使用PDFBox从PDF解析出匹配字符串。我的解决方案可能对其他人有帮助 使用PDFBox从PDF中获取文本列表,如下所示(为简洁起见省略例外): 请注意PDFBox字符串中的“a0”,其中在Java中有空格('20') 解决方案是使用正则表达式来标识行:EMERA\S+INCORPORATED。这比匹配提供了更好的控制器,所以它还不错。但是发现这一点有点烦人,因为在查看日志时,被比较的字符串看起来是相同的,但是contains和equals都

这与其说是一个问题,不如说是一门学问。我最近正在努力使用PDFBox从PDF解析出匹配字符串。我的解决方案可能对其他人有帮助

使用PDFBox从PDF中获取文本列表,如下所示(为简洁起见省略例外):

请注意PDFBox字符串中的“a0”,其中在Java中有空格('20')

解决方案是使用正则表达式来标识行:EMERA\S+INCORPORATED。这比匹配提供了更好的控制器,所以它还不错。但是发现这一点有点烦人,因为在查看日志时,被比较的字符串看起来是相同的,但是contains和equals都返回false

我的结论是,使用正则表达式来识别来自PDF的文本模式(通过PDFBox获得),并确保添加“\S”来表示潜在的空间。也许这篇文章可以帮别人省去一些痛苦。此外,如果这是我的用户错误,也许更熟悉PDFBox的人可以提供更好地使用API的提示

如果这是我的用户错误,也许更熟悉PDFBox的人可以提供更好地使用API的提示

这不是PDFBox API使用中的错误。它根本不是PDFBox特有的。这更多的是错误的期望

不同类型的空间字符 首先,有不同种类的空间字符。当然有最常用的,但也有其他的,特别是

因此,如果您不知道给定文本中只使用了一个特定的空格字符,那么使用带有'\S'而不是''的正则表达式是完全正常的

PDFBox提取什么? 在本案例中,选择PDFBox时,甚至没有使用非中断空间。相反,它在PDF中根深蒂固

从PDF中提取文本时,PDFBox(与其他PDF库一样)使用PDF中有关哪个glyph表示哪个Unicode字符的信息。此信息可通过PDF中相应字体声明的编码条目或TOINCODE条目提供

只有当两个文本块之间存在间隙(不是通过绘制空格字符而是通过移动文本插入点而不是文本字符来创建的自由空间)时,PDF文本提取器才会添加各自选择的空格字符,通常是常规空格

由于PDFBox在后一种情况下确实使用了常规空间,因此当前的问题是第一种情况,PDF本身表明存在一个非破坏性空间

如果这是我的用户错误,也许更熟悉PDFBox的人可以提供更好地使用API的提示

这不是PDFBox API使用中的错误。它根本不是PDFBox特有的。这更多的是错误的期望

不同类型的空间字符 首先,有不同种类的空间字符。当然有最常用的,但也有其他的,特别是

因此,如果您不知道给定文本中只使用了一个特定的空格字符,那么使用带有'\S'而不是''的正则表达式是完全正常的

PDFBox提取什么? 在本案例中,选择PDFBox时,甚至没有使用非中断空间。相反,它在PDF中根深蒂固

从PDF中提取文本时,PDFBox(与其他PDF库一样)使用PDF中有关哪个glyph表示哪个Unicode字符的信息。此信息可通过PDF中相应字体声明的编码条目或TOINCODE条目提供

只有当两个文本块之间存在间隙(不是通过绘制空格字符而是通过移动文本插入点而不是文本字符来创建的自由空间)时,PDF文本提取器才会添加各自选择的空格字符,通常是常规空格

由于PDFBox在后一种情况下确实使用了常规空间,因此当前的问题是第一种情况,PDF本身表明存在一个非破坏性空间

List<String> lines = new ArrayList<String>();
PDDocument document = PDDocument.load(f);
PDFTextStripper pdfStripper = new PDFTextStripper();
String text = pdfStripper.getText(document);
String[] pageText = text.trim().split(pdfStripper.getLineSeparator());
for (String line : pageText) {
        lines.add(line);
}
Line (Parsed from PDF with PDF Box): EMERA INCORPORATED
45 4d 45 52 41 a0 49 4e 43 4f 52 50 4f 52 41 54 45 44

CompanyName (Set In Java): EMERA INCORPORATED
45 4d 45 52 41 20 49 4e 43 4f 52 50 4f 52 41 54 45 44