使用 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插件未生效原因分析

maven-shade-plugin 和自定义包装类型

maven-shade-plugin 的用途是啥,为啥要重新定位 Java 包?

如何判断哪个签名的 jar 导致 maven-shade-plugin 失败?

使用maven-shade-plugin插件解决spark依赖冲突问题