マルチラインな文字列の描画 [ソフトウェア開発のようななにか]
以下サンプル。
import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.AttributedString; import javax.imageio.ImageIO; public class DrawMultilineString { /** * 改行コード */ public static final String LINE_SEPARATOR = System .getProperty("line.separator"); /** * 実行メソッド * * @param args * 今回は使用しない * @throws IOException * 画像の読み書きに失敗した場合 */ public static void main(String[] args) throws IOException { // 出力する文字列 String text = "01234567890123456789012345678901\r\n12345678901234567890もいもいこでもいもい"; // この画像の上に文字を出力するよ BufferedImage bufferedImage = ImageIO.read(new File("template.png")); // 文字列を書きだす位置 float y = 30; float x = 30; // 文字列を書きだす領域の幅だよ float wrappingWidth = bufferedImage.getWidth() - (x * 2); // テキストとテキストの属性を保持するクラスだよ AttributedString as = new AttributedString(text); // 属性つけるよ! as.addAttribute(TextAttribute.FONT, new Font("MS ゴシック", Font.PLAIN, 15)); as.addAttribute(TextAttribute.FOREGROUND, Color.BLACK); as.addAttribute(TextAttribute.BACKGROUND, new Color(0, 0, 0, 0)); Graphics2D g2 = bufferedImage.createGraphics(); // 物差しさんが欲しがる情報は俺が持ってる FontRenderContext context = g2.getFontRenderContext(); // 私が物差しです LineBreakMeasurer measurer = new LineBreakMeasurer(as.getIterator(), context); int position; // 文字列の最後まで while ((position = measurer.getPosition()) < text.length()) { // 行のレイアウト TextLayout layout; // 改行してる? int indexOf = text.indexOf(LINE_SEPARATOR, position); // してる if (position < indexOf) { // 改行位置の手前の分までレイアウトもってくる layout = measurer.nextLayout(wrappingWidth, indexOf, false); } // してない else { // 自動で折り返してるとこまでレイアウト持ってくる layout = measurer.nextLayout(wrappingWidth); } // レイアウトとれなかった if (layout == null) { break; } // Y座標を更新(さっきの位置をベースラインの上として、ベースラインに合わせる) y += layout.getAscent(); // 右寄せだったらX座標を更新 float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout .getAdvance()); // 文字列を書きだす layout.draw(g2, x + dx, y); // Y座標を更新(ベースラインの下 + 行間) y += layout.getDescent() + layout.getLeading(); } // 書き出し ImageIO.write(bufferedImage, "png", new File("sample.png")); } }
これが背景に使った画像
これが実行結果
参考資料
Javaでメーラーの起動 [ソフトウェア開発のようななにか]
んで、画像を作成して適当なフォルダに保存するとこまではできたんだけど、メールに自動で添付する方法がわからん…。
出来れば送信箱に残っていて欲しいので、[送る]メニューよろしく規定のメーラー起動して、画像ファイルは添付済みって感じにしたい。
とりあえず↓で規定のメーラーを起動することはできた。
public class MailTest { public static void main(String[] args) throws IOException, URISyntaxException { String string = String.format("mailto:%s?subject=%s&body=%s&attach=%s", "test@test.test", "件名", "本文", "hoge.png"); Desktop desktop = Desktop.getDesktop(); // メール作成ウィンドウを起動 desktop.mail(new URI(string)); } }
分かってはいたが、 attach じゃ無理か…(一部のメーラーならできるらしい)
どうやってやればいいんだ…だれかたすけて
HelloWorld的な何か [ソフトウェア開発のようななにか]
SyntaxHighlighter というのが有名らしいので試しに使ってみる。
ダウンロードして使うっぽいが、 so-net ブログは .js ファイルのアップロードができない…。
と思ったらホスティングサービスあるのね。よかった。
public class PastaSource { public static void main (String[] args) { System.out.println("HelloWorld!"); } }
できてるかな…。
だめだった…なんだこれ。orz
ってよくみたらキーワード広告ONにしっぱなしなだけか。
これでどうだ。
できたー!いやっほーい!\(^o^)/
GETパラメータ、というかurlに直接書いてあるパラメータ [ソフトウェア開発のようななにか]
が、エンコードもなんもしてなかった。
そしたら
パラメータの両端の「&(アンパサンド)」と「+(プラス)」と「#(ナンバーサイン)」と「?(クエスチョン)」(だったと思う。「+」しかはっきりとした記憶が無い)が消えた。
ようするに
+ほげ
が
ほげ
になった。
InternetExplorer6のファイルのダウンロードダイアログ [ソフトウェア開発のようななにか]
で苦戦した。
Content-Dispositionをattachment(どうでもいいけど添付ファイル表現タイプと私は呼んでいる)にして、
折角IEでしか使わない想定の機能なのに、
もとのファイル名が長いからエンコードできない状態で、
filenameパラメータにある半角記号を含めたファイル名を指定したらえらいことになった。
①#(ナンバーサイン)の場合
なぜかファイルのダウンロードダイアログのファイル名の「#」が「_(アンダーライン)」に変換された。
実際のファイル名も「_」になってる。
②;(セミコロン)の場合
filenameパラメータの終端と判定されているらしく、「;」以降のファイル名が表示されない。
なので、
ほげ.txt;ふが.exe
みたいな名前にしたら
ほげ.txt
って表示される。
(ちなみにファイル名はダブルクォートで括ってある。なのになんでだぜ)
③&(アンパサンド)の場合
まず、ファイルのダウンロードダイアログのファイル名から「&」が消える。
そんで、ファイル名の最後の「&」の次の文字に、下線が修飾される。
(ちなみに、実際のファイル名は「&」が残ってる)
あ&い&う&え&お.txt
だと
あいうえお.txt
になる。
①は、別件でIE7の記号が化けるのを調べてたときに、
ファイル名に向かない文字を「_」に変えるコードがあるってサポートオンラインに載ってたし、
実際は設定できるけど、#がファイル名にはお勧めできないって聞いたことがあるから、
そういうもんなのかなと勝手に納得。
②と③も、まあそういうもんなのかなと勝手に納得。
③はなんかどうしようもできなさそうだし、①と②はエンコーディングすれば解決するみたいだけど、
前提条件でエンコーディングできないから、
仕方ないから「#」と「;」だけエンコーディングするようにした。