我有一个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编码,或者有一个编码,其差异数组仅包含取自 Adobe 标准拉丁字符集的字符名称以及符号字体中的命名字符集(请参阅附录 D):
a) 根据表D.1和字体的对应关系将字符代码映射到字符名称差异 array.
b) 在 Adobe Glyph List(参见参考书目)中查找字符名称以获得相应的 Unicode 值。
-
如果字体是使用表 118 中列出的预定义 CMap 之一的复合字体(Identity–H 和 Identity–V 除外)或其后代 CIDFont 使用 Adobe-GB1、Adobe-CNS1、Adobe-Japan1 或 Adobe-Korea1人物收集:
a) 根据字体的 CMap 将字符代码映射到字符标识符 (CID)。
b) 从字体的 CMap(例如 Adobe 和 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(使用前将#替换为@)