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ボックスが2つの異なる形式でテキストを返すことです...

3 つの質問があります。

  1. シェードプラグインエンコーディングで構築されたjarが異なるのはなぜですか?
  2. シェードプラグインで構築された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つの事実があります(質問2について):

質問 1 と 3 の場合:

あなたの問題は、byte[]返された byextractText()を文字列に変換する方法に関連していると思います。

new String(byte[])プラットフォーム エンコーディングを使用します。したがって、Netbeans 内またはシェル内でこれを実行すると、異なる結果が得られる可能性があります。これは、Netbeans 内で実行する場合、プラットフォームのエンコーディングが異なる可能性があるためです。

結果を処理するコードを投稿するextractText()と役立つ場合があります。

于 2013-02-02T15:37:35.747 に答える