我有一个使用 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 中提取的文本作为字节数组。当我从 NetBeans Run
运行程序时它可以工作按钮,但是当我从使用 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");
最佳答案
首先,这里有 2 个事实(关于您的问题 2):
- 根据this code :默认输出编码为UTF-8。
- 有一个PDFTextStripper constructor将输出编码作为参数。
对于问题 1 和 3:
我认为您的问题与将 extractText()
返回的 byte[]
转换为字符串的方式更相关。
new String(byte[])
使用平台编码。因此,在 netbeans 或 shell 中执行此操作可能会产生不同的结果,因为我预计在 Netbeans 中运行时平台编码可能会有所不同。
发布处理 extractText()
结果的代码可能会有所帮助。
关于java - 使用使用 maven-shade-plugin 构建的 pdfbox 的程序结果与正常的 NetBeans Run 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14662373/