&引用;(someString)Tj“;到java字符串编码问题(PDFBox)

&引用;(someString)Tj“;到java字符串编码问题(PDFBox),java,string,pdf,encoding,pdfbox,Java,String,Pdf,Encoding,Pdfbox,我尝试使用PDFBox 2.0.0解析PDF的内容流。 下面是处理它的代码的一部分: InputStream是; 试一试{ is=this.input.getDocumentCatalog().getPages().get(page).getContents(); }捕获(IOE异常){ e、 printStackTrace(); 返回; } BufferedReader br=新的BufferedReader(新的InputStreamReader(is)); 弦线; 做{ 试一试{ line

我尝试使用PDFBox 2.0.0解析PDF的内容流。
下面是处理它的代码的一部分:

InputStream是;
试一试{
is=this.input.getDocumentCatalog().getPages().get(page).getContents();
}捕获(IOE异常){
e、 printStackTrace();
返回;
}
BufferedReader br=新的BufferedReader(新的InputStreamReader(is));
弦线;
做{
试一试{
line=br.readLine();
}捕获(IOE异常){
e、 printStackTrace();
试一试{
br.close();
}捕获(IOE1异常){
e1.printStackTrace();
}
返回;
}
如果(行!=null){
系统输出打印项次(行);
}
}while(line!=null);
问题是当我到达“(someString)Tj”行时:下面是我的代码返回的输出示例:

BT
/F2 7.0866 Tf
0 Tr
7.0866 TL
0.001 Tc
65 Tz
0 0 Td
(
ET
如您所见,“(someString)Tj”行变成了“(”…
在eclipse的调试模式下,当程序到达此行时,“line”变量包含以下值:

"(
(与以秒结尾的任何其他字符串不同,“(”后面没有任何内容,开头有一个“)。
如果扩展字符串值,则得到以下字符数组:

[0] (   
[1] 
[2] %   
[3] 
[4] $   
[5] 
[6] 
[7] 
[8] 
[9] )
[10]T   
[11]j   
一些空案例返回一个“void”值(这会在eclipse中引发“生成的值(void)与声明的类型(char)不兼容”错误),另一些则包含一些不可理解的字符。我认为问题来自错误的字符编码,但我找不到解决方案

我已经试过一些东西,比如

line=新字符串(br.readLine().getBytes(“UTF-8”),“UTF-8”);
或者是这样,但因为我不确定问题是什么,所以很难解决它

有人能给我解释一下问题是什么以及最终如何解决吗

谢谢你的帮助。

问题解决了 有人能给我解释一下问题是什么吗

问题在于,您试图将内容流视为在某种单一标准编码中由纯文本数据组成

这是错误的。

虽然运算符和数值参数确实是以ASCII'ish格式给出的,但显示运算符的文本的字符串参数的内容可能以完全不同于ASCII'ish数据的方式进行编码(更不用说UTF-8编码的方式了)

引用规范:

显示运算符的文本的字符串操作数应解释为识别待绘制符号的字符代码序列

对于简单字体,字符串的每个字节应被视为单独的字符代码。然后,应在字体编码中查找字符代码,以选择字形,如9.6.6“字符编码”中所述

对于复合字体(PDF 1.2),可使用多字节代码选择字形。在这种情况下,字符串的一个或多个连续字节应视为单字符代码。代码长度和从代码到字形的映射在称为CMap的数据结构中定义,如9.7“复合字体”中所述

(第9.4.3节显示操作员的文本)

如果使用标准编码,这些特定于字体的编码可能会让人想起ASCII或拉丁-1或类似的编码,但特别是在部分嵌入字体的情况下,您通常会发现与已知编码没有任何关系的特殊编码

因此,要正确解析内容流,必须将其视为二进制数据,并根据内容流中该位置的当前字体编码解释字符串操作数

解决办法 如何解决

在PDFBox中,有些类已经解释了内容流,并尝试为绘制的文本查找Unicode字符串表示形式

因此,你可能想看看

  • PDFTextStripper
    类,它是基本的PDFBox文本提取类
  • PDFTextStripper
    派生的类,这些类提供了特殊的文本提取问题解决方案,例如,用于从页面上的给定区域提取文本
  • PDFTextStripper
    派生自,它提供了一个通用的内容流解析框架;以及
  • PDFBox示例类集中于上面所有这些类,它们的用法不清楚
根据OP的后续评论:

我选择这种方法来提取PDF的内容,因为我想提取的不是一些文本,而是向量生成的模式。在这个特定问题中,我试图提取的文本是链接到模式特定部分的变量。这就是为什么我不能真正使用“PDFTextStripper”,因为我需要关于向量的全局信息围绕着我提取的文本。但也许我的方法从一开始就错了

要正确解析这些文本,您必须执行与文本剥离器类似的操作,我建议而不是重新发明轮子

PDFTextStripper
扩展类
PDFTextStreamEngine
,该类又扩展了
PDFStreamEngine

PDFStreamEngine
是一个处理PDF内容流并执行某些操作的类;它为希望处理该流的客户端提供回调接口

PDFTextStreamEngine
是通过
TextPosition
对文本进行高级处理的
PDFStreamEngine
子类

您可能希望为任务扩展后两个类中的一个,并为矢量图形操作创建和注册回调。这些回调可以收集您需要的矢量图形操作。文本数据的并行回调提供链接到特定部分的变量

使用这些类可能会带来一定程度的复杂性,您将不得不对它们进行一些研究,但一旦您了解了它们的内部工作原理,它们很可能会变得非常精确