pdfBox 返回错误的编码字符

2024-04-28

我有一个pdfhttp://www.persianacademy.ir/UserFiles/File/fe1394.pdf http://www.persianacademy.ir/UserFiles/File/fe1394.pdf我想从中提取单词(包含波斯语单词。)。我使用 PDFBox 库来获取单词。这是我的代码:

package ir.blog.stack;

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.cos.COSDocument;
import org.apache.pdfbox.io.RandomAccessFile;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

public class PDFManager {

    public static void main(String[] args) {
        PDFManager pdfManager = new PDFManager();
        pdfManager.setFilePath("/home/saeed/Documents/words.pdf");
        try {
            System.out.println(pdfManager.ToText());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private PDFParser parser;
    private PDFTextStripper pdfStripper;
    private PDDocument pdDoc ;
    private COSDocument cosDoc ;

    private String Text ;
    private String filePath;
    private File file;

    public PDFManager() {

    }
    public String ToText() throws IOException
    {
        this.pdfStripper = null;
        this.pdDoc = null;
        this.cosDoc = null;

        file = new File(filePath);
        parser = new PDFParser(new RandomAccessFile(file,"r")); // update for PDFBox V 2.0

        parser.parse();
        cosDoc = parser.getDocument();
        pdfStripper = new PDFTextStripper();
        pdDoc = new PDDocument(cosDoc);
        pdDoc.getNumberOfPages();
        pdfStripper.setStartPage(1);
        pdfStripper.setEndPage(5);

        // reading text from page 1 to 10
        // if you want to get text from full pdf file use this code
        // pdfStripper.setEndPage(pdDoc.getNumberOfPages());
        Text = pdfStripper.getText(pdDoc);
        return Text;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

}

这是输出的一部分:

° ǽA ° SwA ²j±ÇÇM/SwA ²joÇ Ak¼ÇQ ³Ç«AjA p°oÇ«A ³ÇM BÇU éÇ
BÇM ¤ Ø°A ·ª¦ °j ³ An <»wB®{Sv½p> ° <»wB®z¯BMp> ,<³¯BhQBa> ,<³¯BiRnB\U>
»¯BwC³ÇM ©½o¼¢Moǯnj kǯA²k{ ³TiBw <»wB®{> BM ¨°j ·ª¦ °j ° <³¯Bi> ·ª¦
k{BÇM ³TÇ{Aj j±]° o¯ ßB
UA ¬C nj ³ ºA²kîB RBª¦ ½A ߺÀ«A ³ ©¼MB½»«nj
/jnAk¯
° ²k{tBLTA »¼® Øßi pA j±i »Moî Øßi ° ²k{ ³To£ »Moî Øßi pA B« Øßi

我应该采取额外的行动来获得正确的词语吗?


相关 PDF 根本不包含文本提取所需的信息。您必须尝试使用​​ OCR。

详细

为了成功从 PDF 中提取文本,PDF 必须包含一些有关每个使用的字形表示 Unicode 字符的信息。


PDF 规范描述了以下文本提取过程:

9.10.2 将字符代码映射到 Unicode 值

符合要求的读者可以按照给定的优先级使用这些方法,将字符代码映射到 Unicode 值。特别是,带标签的 PDF 文档应至少提供以下方法之一(请参阅 14.8.2.4.2,“带标签的 PDF 中的 Unicode 映射”):

  • 如果字体字典包含转UnicodeCMap(参见 9.10.3,“ToUnicode CMaps”),使用该 CMap 将字符代码转换为 Unicode。

  • 如果字体是使用预定义编码之一的简单字体MacRoman编码, Mac专家编码, or WinAnsi编码,或者有一个编码,其差异数组仅包含取自 Adob​​e 标准拉丁字符集的字符名称以及符号字体中的命名字符集(请参阅附录 D):

    a) 根据表D.1和字体的对应关系将字符代码映射到字符名称差异 array.

    b) 在 Adob​​e Glyph List(参见参考书目)中查找字符名称以获得相应的 Unicode 值。

  • 如果字体是使用表 118 中列出的预定义 CMap 之一的复合字体(Identity–H 和 Identity–V 除外)或其后代 CIDFont 使用 Adob​​e-GB1、Adobe-CNS1、Adobe-Japan1 或 Adob​​e-Korea1人物收集:

    a) 根据字体的 CMap 将字符代码映射到字符标识符 (CID)。

    b) 从字体的 CMap(例如 Adob​​e 和 Japan1)获取其使用的字符集的注册表和排序来电显示系统信息字典。

    c) 通过以注册表-排序-UCS2 格式连接注册表和在步骤 (b) 中获得的排序来构造第二个 CMap 名称(例如,Adobe-Japan1-UCS2)。

    d) 获取具有步骤 (c) 中构造的名称的 CMap(可从 ASN 网站获得;参见参考书目)。

    e)根据步骤(d)中获得的CMap对步骤(a)中获得的CID进行映射,产生Unicode值。

如果这些方法无法生成 Unicode 值,则无法确定字符代码代表什么,在这种情况下,符合要求的读者可以选择自己选择的字符代码。

对于示例 PDF,有问题的字体

  • 没有转Unicode maps;
  • 是复合的;
  • use 身份-H as Encoding;
  • have a 来电显示系统信息Adobe-Identity-0 的值。

因此,上面引用的过程无法生成 Unicode 值。


PDF 规范也允许使用实际文本结构元素字典或标记内容序列中的条目,用于覆盖某些内容应表示的文本。

对于示例 PDF,没有实际文本使用条目。


人们可以比 PDF 规范描述的更深入地研究,特别是可以深入研究嵌入式字体程序,以查找有关某些字体字形表示的 Unicode 字符的字体特定信息。

对于示例 PDF,嵌入字体程序

  • 不包含字形的 Unicode 值;
  • 使用无信息的字形名称,例如“glyph89”。

因此,对于示例 PDF,您很可能必须求助于 OCR。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pdfBox 返回错误的编码字符 的相关文章

随机推荐

  • 如何在 Swift 中正确测试 Core Data

    已经有很多关于此的主题 但我还没有找到适用于 Swift Xcode 6 2 的解决方案 为了在 Swift 中测试 Core Data 支持的类 我生成了新的托管对象上下文 然后将其注入到我的类中 Given let testManage
  • 从实例驻留在固定格式(数据库、MMF)的基类派生...如何安全?

    Note 我正在寻找有关正确搜索词的任何建议来阅读此类问题 对象关系映射 http en wikipedia org wiki Object relational mapping我想到了一个可以找到一些好的现有技术的地方 但我还没有看到任何
  • CALayer 不显示

    这是我第一次尝试使用 CALayer 构建成功并且没有报告错误 所以我认为我一定做了一些明显错误的事情 但该图层根本不显示 void viewDidLoad Get Reliant Magenta in amazingly verbose
  • 正则表达式:忽略大小写

    如何使以下正则表达式忽略大小写 它应该匹配所有正确的字符 但忽略它们是小写还是大写 G a b 假设你想要whole正则表达式忽略大小写 你应该寻找i flag http www regular expressions info modif
  • Windows 8 的 mvvmlight 中缺少 EventToCommand 行为 - 解决方法?

    问题确实说明了一切 我正在使用 MVVM Light 用 XAML C 编写一个 Windows 8 应用程序 我注意到 EventToCommand 功能尚未实现 有人可以建议对此有任何解决方法吗 thanks 您现在可以使用 Event
  • 使用带有二进制存档的 boost 序列化时出错

    我在读取时收到以下错误boost archive binary iarchive进入我的变量 test serialization 9285 0x11c62fdc0 malloc can t allocate region mach vm
  • 使用当前用户的凭据进行 javamail NTLM 身份验证

    如何将 JavaMail API 与 NTLM 身份验证结合使用到 Exchange 服务器 而无需指定用户名和密码 而是自动使用当前登录用户的凭据 单点登录 我的目的是让我的客户端程序 在我公司网络中的 Windows 计算机上运行 能够
  • 如何在 Prolog 中计算数字序列的和

    任务是计算从0到M的自然数之和 我使用SWI Prolog编写了以下代码 my sum From To From gt To my sum From To S From 0 Next is 1 S is 1 my sum Next To S
  • JMS队列消息接收顺序

    我按顺序在同一目标中添加两条 JMS 消息 这两条消息的接收顺序是否与我添加它们的顺序相同 或者是否有可能进行相反的排序 即首先检索目的地中首先接收到的消息 我将添加到目的地 producer send Msg1 producer send
  • Groovy 二维数组

    我有3个数组 l1 l2 and l3 每个都有 5 个字符 e g l1 A B C D E 二维数组由这些组成 screen l1 l2 l3 所以它看起来像这样 screen 我怎样才能迭代这个数组 我打电话吗screen 5 or
  • 在单个图中,由“标签”列分割的所有列的箱线图

    看着箱线图 API 页面 http seaborn pydata org generated seaborn boxplot html seaborn boxplot 我想要看起来像这样的组合的东西 gt gt gt iris sns lo
  • gform_after_submission 发布到第三方 API

    我正在尝试使用客户WordPress网站的functions php文件中的gform after submission钩子将这串信息发送到第三方API 此url由第三方客户提供 我需要将其与每次注册相匹配 这是我在 Functions p
  • 使用 window.print 内容将网页下载为 pdf

    我想要一个链接 当单击该链接时 会自动开始下载网页的可打印版本 我正在使用Moodle 我想要的内容是完全相同的如果我使用 ctrl p 下载页面并保存为 pdf 或使用 a href Download web page a 我正是想要该内
  • 根据自定义数组位置排序帖子

    我想根据自定义字段列出帖子列表 这里我有 9 个帖子 有不同的 3 个位置 中 上 下 Post ID title position 1 Post1 Top 2 Post2 Bottom 3 Post3 Top 4 Post4 Bottom
  • C# - 使用 TableAdapter 从存储过程返回单个值返回 null

    我不明白 但我添加到表适配器的存储过程仅返回空值 它应该返回一个简单的整数值 在我使用数据集设计器进行的预览中 我可以清楚地获得我想要的整数值 但由于某种原因 我无法从我的代码中获取价值 我按照MSDN库的说明进行操作 http msdn
  • 对 solr 搜索结果进行排序。给出错误无法对多值字段进行排序:名称

    我对 Apache Solr 搜索比较陌生 我正在尝试对 Solr 查询中的结果集进行排序 查询 名称 abc AND 隐藏 false sort name desc 它显示错误 无法对多值字段进行排序 名称 Solr版本是 7 2 1 如
  • 将列的百分比设置为 0 (pandas)

    我有一个 pandas 数据框 我想将列的某些百分比设置为 0 假设 df 有两列 A B 1 6 2 7 3 8 4 4 5 9 我现在想将 df 的前 20 和后 20 的 B 设置为 0 A B 1 0 2 7 3 8 4 4 5 0
  • 通过 DFS 查找图中的强连通分量

    我正在阅读有关 BFS 和 DFS 的图算法 当我分析通过DFS在图中查找强连通分量的算法时 我想到了一个疑问 为了找到强连通分量 书 Coremen 做了什么 首先它在图上运行 DFS 以获得顶点的完成时间 然后再次以完成时间的降序在图的
  • 如何“安装”自定义 Windows 驱动程序?

    我计划用 C 语言编写一个基本的 Windows 注册表过滤器 该过滤器的目的是挂钩所有 用户和内核特权 注册表调用 以便我可以在我的程序中使用它们 我基本上是复制 Mark Rusinovich 的 regmon 进程监视器 但更基本 我
  • pdfBox 返回错误的编码字符

    我有一个pdfhttp www persianacademy ir UserFiles File fe1394 pdf http www persianacademy ir UserFiles File fe1394 pdf我想从中提取单词