0
2

More than 1 year has passed since last update.

プログラムからpdfの長体を入れる【iText】

Posted at

PDFで長体(縦に長いor横に長い文字)を入れたかった

元々はAmazonのFBA商品ラベルを自分で作りたかった。(物販の人向け)
セラーセントラルからダウンロードできるものは文字数によりフォントの横幅をコントロールして、表示される文字数を変えていた。

出来上がりイメージはこちら
スクリーンショット 2023-02-13 16.47.39.png

行き着くまで

最初は文字幅を変えられるのかと思いきや、あんまりそんな情報が見つからない。
こんなんとか
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あたりでもできないか調べる。

(分かり次第記事追加する)

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2