【问题标题】:Special characters are not converted correctly from pdf to text特殊字符未正确从 pdf 转换为文本
【发布时间】:2013-06-24 09:27:07
【问题描述】:

我有一组包含中欧字符的 pdf 文件,例如 č、Ď、Š 等。我想将它们转换为文本,我已经通过 Apache Tika 尝试了pdftotextPDFBox,但它们中的一些总是没有正确转换。

奇怪的是,同一文本中的相同字符在某些地方被正确转换,而在其他地方则不正确!一个例子是pdf

对于 pdftotext,我使用以下选项:

pdftotext -nopgbrk -eol dos -enc UTF-8 070612.pdf

我的 Tika 代码如下所示:

          String newname = f.getCanonicalPath().replace(".pdf", ".txt");
          OutputStreamWriter print = new OutputStreamWriter (new FileOutputStream(newname), Charset.forName("UTF-16"));
          String    fileString = "path\to\myfiles\"
          try{

              is = new FileInputStream(f);

              ContentHandler contenthandler = new BodyContentHandler(10*1024*1024);
              Metadata metadata = new Metadata();
              PDFParser pdfparser = new PDFParser();

              pdfparser.parse(is, contenthandler, metadata, new ParseContext());
              String outputString = contenthandler.toString();

              outputString = outputString.replace("\n", "\r\n");
              System.err.println("Writing now file "+newname);
              print.write(outputString);

          }catch (Exception e) {
              e.printStackTrace();
            }
            finally {
               if (is != null) is.close();
               print.close();
            }

编辑:忘了说我在从 Acrobat Reader XI 转换为文本时也遇到了同样的问题。

【问题讨论】:

    标签: java pdfbox apache-tika pdf-conversion pdftotext


    【解决方案1】:

    除此之外,这段代码将使用平台默认编码:

    PrintWriter print = new PrintWriter(newname);
    print.print(outputString);
    print.close();
    

    我建议您使用OutputStreamWriter 而不是包装FileOutputStream,并将UTF-8 指定为编码(因为它可以编码所有Unicode,并且通常得到很好的支持)。

    您还应该在finally 块中关闭编写器,我可能会将“阅读”部分与“写作”部分分开。 (我也会避免捕获Exception,但是进入异常处理的细节有点超出了这个答案的重点。)

    【讨论】:

    • 嘿乔恩。感谢你的回答。事实是,我隐藏了一些在字符串级别进行 utf8 转换的代码,即在写入 PrintWriter 之前,但你是对的,OutputStreamWriter 是最好的解决方案。尽管如此,仍然有问题。也许这是由于 pdf 编码的一些问题,但我不是 pdf 专家
    • @YannisP.:在使用 writer 之前你不应该做任何事情——如果你这样做了,你几乎肯定做错了什么,因为普通的 String 没有任何编码(或它始终是 UTF-16,具体取决于您的 POV)。如果您当前正在使用 getBytesString 构造函数来修改字符串,请立即停止这样做。
    • 很好,所以我改成了OutputStreamWriter print = new OutputStreamWriter (new FileOutputStream(newname), Charset.forName("UTF-16"));,但问题仍然存在。我怀疑这是 pdf 格式的普遍问题,因为除其他外,Adobe Reader 的转换器行为相同。
    • @YannisP.:或者你正在阅读的 PDF 有问题?
    • 可能,我已经从同一来源的几个 pdf 中看到了这一点。让我发疯的是一些字符正确转换,而另一些字符转换为例如'}'
    猜你喜欢
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多