我正在尝试获取 pdf 文件并从中获取文本。
我发现了 iText 并一直在使用它,并取得了不错的成功。我剩下的一个问题是连字。
起初我注意到我只是缺少字符。经过一些搜索后,我发现了这个:http://support.itextpdf.com/node/25 http://support.itextpdf.com/node/25
当我知道我缺少的是连字时,我开始寻找解决问题的方法,但目前还没有找到解决方案。
这是我的代码:
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.FilteredTextRenderListener;
import java.io.File;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.Formatter;
import java.lang.StringBuilder;
public class ReadPdf {
private static String INPUTFILE = "F:/Users/jmack/Webwork/Redglue_PDF/live/ADP/APR/ADP_41.pdf";
public static void writeTextFile(String fileName, String s) {
// s = s.replaceAll("\u0063\u006B", "just a test");
s = s.replaceAll("\uFB00", "ff");
s = s.replaceAll("\uFB01", "fi");
s = s.replaceAll("\uFB02", "fl");
s = s.replaceAll("\uFB03", "ffi");
s = s.replaceAll("\uFB04", "ffl");
s = s.replaceAll("\uFB05", "ft");
s = s.replaceAll("\uFB06", "st");
s = s.replaceAll("\u0132", "IJ");
s = s.replaceAll("\u0133", "ij");
FileWriter output = null;
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8"));
writer.write(s);
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (output != null) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
try {
PdfReader reader = new PdfReader(INPUTFILE);
int n = reader.getNumberOfPages();
String str = PdfTextExtractor.getTextFromPage(reader, 1, new SimpleTextExtractionStrategy());
writeTextFile("F:/Users/jmack/Webwork/Redglue_PDF/live/itext/read_test.txt", str);
}
catch (Exception e) {
System.out.println(e);
}
}
}
在上面引用的 PDF 中,有一行内容如下:
其设计差异的一部分是屋顶线
但是当我运行上面的 Java 类时,文本输出包含:
其设计差异的一部分是屋顶
请注意,差异变成了差异,屋顶线变成了屋顶线。
有趣的是,当我从 PDF 复制并粘贴到堆栈溢出文本字段时,它看起来也像第二个句子,其中两个连字“ff”和“fl”简化为简单的“f”。
我希望这里有人可以帮助我弄清楚如何捕获连字,并可能用它们代表的字符替换它们,例如将连字“fl”替换为实际的“f”和“l”。
我对 PDFTextExtractor 的输出进行了一些测试,并尝试用实际字符替换连字 unicode 字符,但发现这些连字的 unicode 字符在它返回的值中不存在。
看来 iText 本身一定是没有正确读取这些连字。我希望有人知道如何解决这个问题。
感谢您提供的任何帮助!
TLDR:使用 iText 将 PDF 转换为文本,缺少字符,发现它们是连字,现在我需要捕获这些连字,不知道如何去做。