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 つの質問があります。
- シェードプラグインエンコーディングで構築されたjarが異なるのはなぜですか?
- シェードプラグインで構築されたjarで使用されるエンコーディングを制御/設定するにはどうすればよいですか?
- PDFボックスにテキストを正しい形式で返すように強制するにはどうすればよいですか?
コマンドラインPDFBoxには、エンコーディングを設定するオプションがあることを知っています:
java -jar {$jar_path} ExtractText -encoding UTF-8
しかし、私は PdfBox api でそれを見つけることができません...
解決済み: 変更する必要がありました
pdfStripper.getText(this.document).getBytes();
に
pdfStripper.getText(this.document).getBytes("UTF8");