2017-11-01 18 views
0

私はitextを使用して文書を読み込み、その中の文字列を置き換えようとしています。しかし、いったん操作されると、すべてのスペイン語文字が迷惑な文字になります。以下は、pdfを変更するためのコードです。実際のPDFでIText - PdfDictionaryとPDF Stamperを使用してスペイン語の文書を編集する

PdfReader  reader = new PdfReader(src); 
    PdfDictionary dict = reader.getPageN(1); 
    PdfObject  object = dict.getDirectObject(PdfName.CONTENTS); 
    if (object instanceof PRStream) { 
     PRStream stream  = (PRStream) object; 
     byte[] data  = PdfReader.getStreamBytes(stream); 
     String dataString = new String(data); 
     dataString = dataString.replace(sourceString, replacementString); 
     stream.setData(dataString.getBytes("UTF-8")); 
    } 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    stamper.close(); 
    reader.close(); 

私は、「第20回ストリート」に置き換えています文字列$ {アドレス線1}があり

これは、ストリーム

にあるこのスペイン語ではなく動作します

DocumentaciónはDocumentaci�nになります

他のスペイン語でも同じです。

また、Javaコンソールでbytes []を表示して、読み込み自体がその文字を正しく取得しないことがわかりました。

提案がありますか?

答えて

1

あなたは(UTF-8使用)バイトに戻って、文字列をオンにすると

dataString.getBytes("UTF-8") 

(いくつかのデフォルトのエンコーディングを使用して)文字列にバイトを回すために

new String(data) 

を使用しています。

したがって、最初の操作でのデフォルトのエンコードがutf-8と一致しない場合、これらの変換は上記のようにアーティファクトを作成します。

ので、代わりに

new String(data, encoding) 

dataString.getBytes(encoding) 

を使用してください。

言われて

は、UTF-8ではなくラテン-1/ISO-8559-1の線に沿って何かを使用し、ここで非常に不適切なエンコーディングです。


あなたのアプローチの編集は、非常に特定のPDFでしか機能しないと言われています。特に、使用されるフォントのエンコーディングはでなければならず、WinAnsiEncodingでなければならず、行または "フィールド"はそれぞれ1つの命令で描画する必要があります。さらに、置き換えられたテキストよりもはるかに長いものであってはならず、Latin-1とWinAnsiEncodingが異なる文字やPDFで特別な意味を持つ文字を含むことはできません。文字列。私の評判はそれほど高くないよう

+0

が++ 1を行うことはできませんが、これは私のために働い::: 文字列dataString =新しい文字列(データを、 "ISO-8859-1"); dataString = dataString。置き換え(sourceString、replacementString); stream.setData(dataString.getBytes( "ISO-8859-1")); – SaChi

+0

良いあなたのPDFのプロデューサーが変わると、あなたのコードが突然動作を停止するかもしれません。ちなみに、あなたは実際には* upvote *できませんが、あなたは*受け入れることができます*投票の矢印のすぐ下に、左上のダニをクリックします。 – mkl

+0

私は自分自身でITextからpdfを作成していますが、テキストを変更してどこに行かれたのかはわかりませんので、私はこの場合プロデューサとコンシューマです:) – SaChi

関連する問題