iText PdfTextExtractor在结果文本中缺少连字

时间:2013-09-12 20:38:58

标签: java pdf unicode itext ligature

我正在尝试获取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”。

我希望这里的某个人可以帮我弄清楚如何抓住连字并用他们所代表的字符替换它们,就像在连字“fl”中用实际的“f”和“l”代替一样。

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

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

感谢您提供任何帮助!

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

0 个答案:

没有答案