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

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

シーランド公国の爵位をとってみた

ほとんど出落ちみたいな話ですけどね・・。 ネット上ではフツーに情報としてありますが、 シーランド公国 という(自称)国家の爵位を取ってみました。