MHTMLの展開
とあるMHTMLファイルをOffice 2004だと問題なく表示出来ていたのに2008だと画像が表示出来なくなっていた。時間に余裕ができていたのでMHTMLを展開するプログラムを書いた。
javax.mail.Multipartを利用するのでJavaMailとJAFを含めて一つのJARにマージして実行*1したらSecurityExceptionを吐く。どうもMANIFEST.MFにあるべきハッシュが無いので困っているっぽい。
面倒そうなので今回はマージせずにクラスパスに含めて実行した。
以下コード。
import java.net.*; import java.io.*; import java.util.*; import javax.activation.*; import javax.mail.*; import javax.mail.internet.*; public class unmht { public static void main (String args[]) throws MalformedURLException, MessagingException, IOException { File file = new File(args[0]); String baseName = removeFileExtension(file.getName()); URL url = file.toURL(); DataSource dataSource = new URLDataSource(url); Multipart multipart = new MimeMultipart(dataSource); System.out.println("File: " + file + " has " + multipart.getCount() + "body."); for (int i = 0; i < multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); System.out.println("Part " + i); Enumeration e = bodyPart.getAllHeaders(); while (e.hasMoreElements()) { Header header = (Header) e.nextElement(); System.out.println(header.getName() + ": " + header.getValue()); } String contentLocation = bodyPart.getHeader("Content-Location")[0]; String outputFilename = removePrefixBefore(contentLocation, baseName); File outputFile = new File(outputFilename); adjustDirectory(outputFile); InputStream inputStream = bodyPart.getInputStream(); OutputStream outputStream = new FileOutputStream(outputFile); int b; while ((b = inputStream.read()) > -1) { outputStream.write(b); } } } public static void adjustDirectory(File file) { File parent = file.getParentFile(); if (parent != null) { parent.mkdirs(); } } public static String removePrefixBefore(String str, String base) { int basePosition = str.indexOf(base); if (basePosition > -1) { return str.substring(basePosition); } else { return str; } } //from http://www7a.biglobe.ne.jp/~java-master/samples/file/RemoveFileExtension.html public static String removeFileExtension(String filename) { int lastDotPos = filename.lastIndexOf('.'); if (lastDotPos == -1) { return filename; } else if (lastDotPos == 0) { return filename; } else { return filename.substring(0, lastDotPos); } } }