PDFで長体(縦に長いor横に長い文字)を入れたかった
元々はAmazonのFBA商品ラベルを自分で作りたかった。(物販の人向け)
セラーセントラルからダウンロードできるものは文字数によりフォントの横幅をコントロールして、表示される文字数を変えていた。
行き着くまで
最初は文字幅を変えられるのかと思いきや、あんまりそんな情報が見つからない。
こんなんとか
https://helpx.adobe.com/jp/indesign/kb/4096.html
PDFLibにはあるみたいだった
ただ、有償のものは避けたかったので他のライブラリで探す
あんまりドンピシャの情報なし、というか長体を英語でどう表現されてるかわからず…
PDFの内容を直接覗いてみる。
Amazonの商品ラベルのPDFには「iText 2.1.4」の文字が。
これは良いヒント、早速iTextのドキュメント漁る。
しかし、これでもよくわからず…
まだググる
https://ateraimemo.com/Swing/CondensedFontLabel.html
こういうのはひかかったが、Swingなのでそのまま適用できず…
アフィン変換?
http://www.nilab.info/z3/20070802_zlashdot_000694.html
アフィン変換でボックスサイズを色々変えられるみたい。
ただ、Paragraphには適用できない様子…
iText 7系なら
https://api.itextpdf.com/iText7/java/7.1.13/com/itextpdf/io/font/constants/FontStretches.html
Font Condensedとか指定できるみたい。
ただ、7系じゃなくて2系で再現したかったので一旦見送り…
再度PDFの内容覗く
(参考にさせていただきました
https://www.antenna.co.jp/pdf/reference/pdftext.html
https://www.pdf-tools.trustss.co.jp/Syntax/font.html
PDFの内容を覗くと、
FontDescriptor 8 0 R/W[1[250] ~~~~~
みたいな情報があり、たぶんこれ(W以降)がフォント幅を制御してる、と思ったらそれであってるみたい。
iTextでは
https://stackoverflow.com/questions/23664495/how-do-i-change-the-weight-of-a-simulated-bold-font-using-itext
似たような情報だったが、chunkごとにフォントの太さを変えたりできるみたい。
chunkのドキュメントを見ると
https://api.itextpdf.com/iText5/java/5.5.9/com/itextpdf/text/Chunk.html
https://api.itextpdf.com/iText5/java/5.5.9/com/itextpdf/text/Chunk.html#setHorizontalScaling-float-
で水平方向のスケーリングを変えられるみたいだ。
ということで、
p = Paragraph()
for (i in 1..99) {
val chunk = Chunk("$i ", font)
chunk.setHorizontalScaling(i / 10.0f)
p.add(chunk)
}
document.add(p)
こういう感じのコードで長体文字の追加ができました。
(結局2.~系での検証できていない…)
この後はPDFSharpあたりでもできないか調べる。
(分かり次第記事追加する)