0

我有使用 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个问题:

  1. 为什么用 shade 插件编码构建的 jar 不同?
  2. 如何控制/设置使用 shade 插件构建的 jar 使用的编码?
  3. 如何强制 PDF 框以正确格式返回文本?

我知道在命令行 PDFBox 中有设置编码的选项:

java -jar {$jar_path} ExtractText -encoding UTF-8

但我在 PdfBox api 中找不到它...


已解决:我必须改变

pdfStripper.getText(this.document).getBytes();

pdfStripper.getText(this.document).getBytes("UTF8");
4

1 回答 1

2

首先,这是两个事实(关于您的问题 2):

对于问题 1 和 3:

byte[]我认为您的问题与您将返回的extractText()转换为字符串的方式更相关。

new String(byte[])使用平台编码。因此,在 netbeans 或 shell 中执行此操作会产生不同的结果,因为我希望在 Netbeans 中运行时平台编码可能会有所不同。

发布处理结果的代码extractText()可能会有所帮助。

于 2013-02-02T15:37:35.747 回答