这不仅仅是一个学问而不是一个问题。我最近一直在努力使用PDFBox来匹配从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);
}
列表现在按顺序包含文件中的所有行。
但是,String.contains和String.equals在日志中看似相同的行上失败(即:&#39; EMERA INCORPORATED&#39;)。在将每个字符转换为十六进制时,很明显Space字符就是问题:
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
注意&#39; a0&#39;在PDFBox字符串中,在Java中有空格(&#39; 20&#39;)。
解决方案是使用正则表达式识别该行:EMERA \ S + INCORPORATED。这样可以提供比匹配更好的控制器,所以它还不错。但是在查看日志时,想出这一点有点烦人,比较的字符串看起来相同,但是包含和等于返回false。
我的结论是,使用RegEx识别PDF格式的文本模式(使用PDFBox获取)并确保添加&#39; \ S&#39;代表潜在的空间。也许这篇文章可以为某人带来一些痛苦。此外,如果这是我的用户错误,也许更熟悉PDFBox的人可以提供更好地使用API的提示。
答案 0 :(得分:2)
如果这是我的用户错误,也许更熟悉PDFBox的人可以提供更好地使用API的提示
PDFBox API使用错误 错误。 不甚至特定于PDFBox 。这更多的是错误的期望。
首先,有不同种类的空格字符。当然,最常用的是Unicode Character 'SPACE' (U+0020),但也有其他人,特别是Unicode Character 'NO-BREAK SPACE' (U+00A0)。
因此,如果您不知道在给定的文本中只使用了一个特定的空格字符,那么使用带有&#39; \ S&#39;的正则表达式是完全正常的。而不是&#39; &#39;
在使用非破坏空间的情况下,甚至没有选择PDFBox使用。相反,它在PDF中根深蒂固。
从PDF中提取文本时,PDFBox(就像其他PDF库一样)使用PDF中有关哪个字形表示哪个Unicode字符的信息。此信息可以通过PDF中相应字体声明的编码条目或 ToUnicode 条目来提供。
仅当两个文本块之间存在间隙(通过绘制空格字符而不是通过移动没有文本字符的文本插入点创建的空闲空间)时,PDF文本提取器会添加其各自选择的空格字符,通常常规空间。
由于PDFBox在后一种情况下确实使用了常规空间,因此当前的问题是第一种情况,PDF本身表明该空间存在非破坏性。