スキップしてメイン コンテンツに移動

iTextSharpでウォーターマーク出力する時の注意

いやー、超ハマりました。
iTextSharpを使って既存のpdfにテキストと画像をウォーターマークとして付与し、出力するという処理を作っていたのですが、一部のpdfで指定した座標に出力できないといった事象が多発していました。
しばらくの間原因がつかめず半ば放置していたのですが、原因判明。
pdfを作成した環境なのか作り方なのかはわからないのですが、用紙サイズが狂っていました。

PdfReaderのインスタンスからGetPageSize(ページ番号)をするとiTextSharp.text.Rectangle型の情報を取得することができます。
取得した情報の中にLeftだのBottomだのといったプロパティがあるのですが、狂っていない(?)pdfだと0になっています。
ここが0以外の数値になっていると、PdfStamperのSetTextMatrixで指定した座標からその分だけずれて出力されてしまいます。

例えばGetPageSizeで取得した情報のLeftが-30、Bottomが50として
SetTextMatrix( x:=10, y:=120 )
をいうメソッドを走らせると、x=40、Bottom=70の位置に出力しようとします。
つまり(LeftもしくはBottom * -1)分だけ左あるいは下に動いてしまうわけです。

というわけで対策としては、SetTextMatrixメソッドでの座標指定時に、このずれた部分で補正してやることです。
VB.NETコードで表現すると・・・(何処かにシンタクスエラーがあるかもしれません)



Dim bf As BaseFont = New BaseFont.CreateFont("C:\Windows\Fonts\msgothic.ttc,0", BaseFont.IDENTITY_H, True)
Dim pr As New PdfReader(path)
Dim fs As New FileStream(outputpath, CreateNew)
Dim ps As New PdfStamper(pr, fs)
Dim under As PdfContentByte = Nothing

Dim underImg As PdfContentByte = Nothing
Dim img = iTextSharp.text.Image.GetInstance(imgpath)

Dim idx As Integer = 0

'全ページにウォーターマークを入れる場合
For idx = 1 To pr.NumberOfPages

    'テキストの場合
    'PdfContentByteを取得
    under = ps.GetUnderContent(idx)
    'テキスト出力開始
    under.BeginText()
    'ベースフォント設定
    under.SetFontAndSize(bf, 11)
    'GetPageSizeでの補正を行いつつテキスト出力開始位置を指定
    under.SetTextMatrix(10 + pr.GetPageSize(idx).Left, 120 + pr.GetPageSize(idx).Bottom)
    'テキスト出力
    under.ShowText("テスト")
    'テキスト出力終了
    under.EndText()

    '画像の場合
    'PdfContentByteを取得
    underImg = ps.GetUnderContent(idx)
    'GetPageSizeでの補正を行いつつ画像出力開始位置(左下)を指定
    img.SetAbsolutePosition(100 + pr.GetPageSize(idx).Left, 300 + pr.GetPageSize(idx).Bottom)
    '画像出力
    underImg.AddImage(img)

Next
ps.Close

・・・という感じになります。

これでとりあえず指定した位置に出力することが可能となりました。
もし同様にハマっている方、参考にしてください。

コメント

このブログの人気の投稿

【VS2019】ある日急にデザイナーがエラーを吐いた時の対処メモ

仕事でVisual Studio 2019 Communityを使う時があるのですが、ある時、前日まで普通に使えていたプロジェクトのうち、フォームのデザイナがエラーを起こしてしまいました。 --- データが失われる可能性を防ぐため、デザイナーの読み込み前に以下のエラーを解決する必要があります。 このファイルのデザイナーに、デザインできるクラスがないため、デザイナーを表示できませんでした。 --- こんなメッセージが。 結論から言うと直ったのですが、この現象への対処法を調べましたのでまとめます。

今更ながらマキシマムザホルモン「絶望ビリー」出演者が誰なのか調べてみた

ふと思い立ってマキシマムザホルモンの「絶望ビリー」のPVに登場する人たちを調べてみました。 ・・・といっても下記の二組(というか一組と一人)は不明なままです。 【不明な人たち】 ・アコギの二人組 ・フェンスを叩いて叫んでいるマッチョな人 ・アナウンサー ・クイズ番組の回答者(一人は亮君だけど) 【判明した出演者】 ・ビジュアル系のバンド・・・ PARFAIT (複数のサイトで確認。たぶん合ってる) ・アイドル系の女の子・・・ 辰巳 奈都子 ・ヒップホップ系の二人組・・・アンディとジョージ☆(というらしい。真偽不明) ・ギターを弾いて歌っている女性・・・ KIKU ( THE SWEET TRIP というバンドのvo/g) というわけで、全員はわかりませんでした。 個人的にはKIKUという人のギターの弾き方が気になっていたので、名前がわかって良かったですw

[アプリ]Pushbulletの代替

Pushbullet使えなくなっちゃったんですよね(だいぶ前に プッシュ通知でPCやモバイルなどにファイルやテキストを共有したりすることができる、Pushbulletというアプリがありました。 私は仕事では状況に応じて デスクトップ(Windows10) Chromebook iPad を使っています。 例えばデスクトップのエディタで書いたテキストを、会議で使うためのiPadに送信したりする時に、このPushbulletは重宝していました。 ただ残念ながら、iOS(iPadOS)版は、2020年に公開停止されてしまいました。 それからはicloud.comのテキストメモやGoogle Keepを使ってみたり、Gmailで自分宛に送ってみたりしていたのですが、同期や転送が遅かったりして、今いち使い勝手に悩んでいました。 そんな中、リモート会議の準備をする時にふと思いついて、あらためて調べ直してみました。