我有使用 PDFBox 1.7.1 的 java 程序,它是用 maven-shade-plugin 2.0 构建的。
这是使用 PDFBox api 的代码:
public class PdfFile {
protected PDDocument document = null;
public boolean load(byte[] bytes) throws IOException {
InputStream is = new ByteArrayInputStream(bytes);
PDFParser parser = new PDFParser(is);
parser.parse();
COSDocument cosDoc = parser.getDocument();
this.document = new PDDocument(cosDoc);
return true;
}
public byte[] extractText() throws IOException {
PDFTextStripper pdfStripper = new PDFTextStripper();
byte[] text = pdfStripper.getText(this.document).getBytes();
return text;
}
public void close() throws IOException {
if(this.document != null) {
this.document.close();
}
}
}
所以基本上方法load()
从字节数组加载pdf文档,方法extractText()
将从PDF中提取的文本作为字节数组返回。当我从 NetBeansRun
按钮运行程序时它可以工作,但是当我从使用 maven-shade-plugin 构建的单个 jar 运行它时,返回的文本的字符编码错误。例如单词:
odpowiadająca (normal polish characters)
odpowiadajšca (netbeans run)
odpowiadajÄca (single shade jar)
我知道它是完全相同的文件(字节数组),作为to PdfFile.load()
两次运行的参数。所以问题在于PDF框以两种不同格式返回文本......
我有3个问题:
- 为什么用 shade 插件编码构建的 jar 不同?
- 如何控制/设置使用 shade 插件构建的 jar 使用的编码?
- 如何强制 PDF 框以正确格式返回文本?
我知道在命令行 PDFBox 中有设置编码的选项:
java -jar {$jar_path} ExtractText -encoding UTF-8
但我在 PdfBox api 中找不到它...
已解决:我必须改变
pdfStripper.getText(this.document).getBytes();
到
pdfStripper.getText(this.document).getBytes("UTF8");