日々修行

カテゴリ: Java

 IllegalPdfSyntaxException: Unbalanced save/restore state operators.

こんなエラーが出た。

このエラーは、直訳すると
「不正なPDFファイル構文例外:アンバランス状態演算子を保存/復元。」

PDF内で描画した 線や楕円を dispose() し忘れてた。
そんな状態で newPage() したから怒られたんだな。

JavaMailでエラーが発生。

javamail java.io.UnsupportedEncodingException: cp932

訳)JavaMailじゃこのメールエンコード「cp932」はサポートしてないよ。

cp932で送ってきてるのはiPhoneだ。

ただ、iPhoneも全てのメールがcp932という訳じゃなさそうだ。

対処法をネットで調べても結局どうしたか載ってない;

エラーの発生箇所は

mimeMessage.getContent();

これじゃそもそもgetContent()を使えないじゃ~ん。

cp932 を Windows-31J に変えればいいよ的なことがいくつかのサイトで書かれていたので、
いろいろ考えて結局以下のとおりにした。

フロー
1.mimeMessage.writeTo()でメールのソースを吐き出す。
2.ソースのcp932をWindows-31Jに文字列置換
3.ソースから新たなMimeMessageを作成。
これで新たなMimeMessageからgetContent()で本文が取れればOKだ。


//ストリームにメールソース吐き出し
OutputStream os = new ByteArrayOutputStream();
mimeMessage.writeTo(os);

//テキストに置き換え
String raw = os.toString();
os.close();

//cp932 => Windows-31J 置換
raw = raw.replaceAll("cp932", "Windows-31J");

//ストリームに読み込み
InputStream is = new ByteArrayInputStream(raw.getBytes());

//新メール作成
Session s = Session.getDefaultInstance(new Properties());
MimeMessage newMimeMessage = new MimeMessage(s,is);
is.close();
raw=null;

//メールの本文取得
String body = newMimeMessage.getContent().toString();

かなり強引な方法だけど、これでとりあえず読めたからOKかな~。
テストとかサラっとしかしてないけど、
応急処置は出来た。

このページのトップヘ