使用 maven-shade-plugin 构建的 pdfbox 程序的结果与正常的 NetBeans 运行不同
Posted
技术标签:
【中文标题】使用 maven-shade-plugin 构建的 pdfbox 程序的结果与正常的 NetBeans 运行不同【英文标题】:Result of program using pdfbox built with maven-shade-plugin is different than normal NetBeans Run 【发布时间】:2013-02-02 13:31:02 【问题描述】:我有一个使用 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");
【问题讨论】:
【参考方案1】:首先,这里有两个事实(关于你的问题 2):
根据this code:默认输出编码为UTF-8。 有一个PDFTextStripper constructor 将输出编码作为参数。对于问题 1 和 3:
我认为您的问题与您将extractText()
返回的byte[]
转换为字符串的方式有关。
new String(byte[])
使用平台编码。因此,在 netbeans 或 shell 中执行此操作会产生不同的结果,因为我希望在 Netbeans 中运行时平台编码可能会有所不同。
发布处理extractText()
结果的代码可能会有所帮助。
【讨论】:
谢谢,你对字符串的看法是对的——在上面的代码中,我使用pdfStripper.getText(this.document).getBytes();
,即String.getBytes()
——我不得不将此行更改为pdfStripper.getText(this.document).getBytes("UTF8");
,它解决了问题,谢谢!以上是关于使用 maven-shade-plugin 构建的 pdfbox 程序的结果与正常的 NetBeans 运行不同的主要内容,如果未能解决你的问题,请参考以下文章
将 maven-bundle-plugin 与 maven-shade-plugin 一起使用
maven-shade-plugin 的用途是啥,为啥要重新定位 Java 包?