2

我正在尝试获取一个 pdf 文件并从中获取文本。

我找到了 iText 并一直在使用它,并且取得了不错的成功。我剩下的一个问题是连字。

起初我注意到我只是缺少字符。在做了一些搜索后,我发现了这个: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 复制并粘贴到 stackoverflow 的文本字段时,它看起来也像第二个句子,两个连字“ff”和“fl”简化为“f”s。

我希望这里有人可以帮助我弄清楚如何捕捉连字,并可能将它们替换为它们所代表的字符,例如将连字“fl”替换为实际的“f”和“l”。

我对 PDFTextExtractor 的输出进行了一些测试,并尝试用实际字符替换连字 unicode 字符,但发现这些连字的 unicode 字符在它返回的值中不存在。

似乎它必须是 iText 本身没有正确读取这些连字的东西。我希望有人知道如何解决这个问题。

感谢您提供的任何帮助!

TLDR:使用 iText 将 PDF 转换为文本,缺少字符,发现它们是连字,现在我需要捕获这些连字,不知道该怎么做。

4

0 回答 0