PDF帳票に透かしを設定する

製品開発担当の大です。こんにちは。


シーオーリポーツ for Java Ver.4では、PDFおよびTIFFに透かしを設定することが可能になりました。今回はこの機能を使用してPDF帳票に透かしを設定する方法をご紹介したいと思います。

透かしを設定する

PDF帳票の出力を開始する前にCrPdfDocumentオブジェクトにCrWatermarkオブジェクトを追加することで、透かしが設定されます。透かしの外観はシーオーリポーツの描画オブジェクトで作成するか、フォーム上にあらかじめ用意しておいたオブジェクトを指定します。以下の例では、テキストオブジェクトを新規に作成して設定しています。

var draw = new CrDraw();
try (var form = CrForm.open(draw, "HokenSample.cfx")) {
    var job = new CrFileOutJob(CorDocumentType.PDF, "透かしを設定.pdf");
    var doc = (CrPdfDocument) job.getDocument();
    doc.setFontSettings("MS 明朝", FontSettings.forEmbed("msmincho.ttc", CorPdfFontEmbedMode.SUBSET));
    doc.setFontSettings("MS ゴシック", FontSettings.forEmbed("msgothic.ttc", CorPdfFontEmbedMode.SUBSET));
    
    // ページ中央に透かしを挿入します
    var width = form.getPaperWidth();
    var height = 3000;
    var startX = 0;
    var startY =  form.getPaperLength() / 2 - height / 2;            
    var text = new CrText(startX, startY, width, height, "これはサンプルです");
    text.setFont(new CrText.Font("MS ゴシック", 640, CorUnit.POINT10));
    text.setAlignment(CorAlignment.CENTER);
    text.setVerticalAlignment(CorVerticalAlignment.CENTER);
    text.setFrame(false);
    text.setTextColor(Color.red);
    var watermark = new CrWatermark(text);
    doc.addWatermark(watermark);
    
    try {
        job.start(draw);
        job.getCrPrinter().setFormSize(form);
        ...
        form.printOut();
        
        job.end();
        
    } catch (CrException cex) {
        job.abort();
        throw cex;
    }
} finally {
    draw.deleteInstance();
}
透かしを設定する

不透明度を設定する

透かしはページの一番上のレイヤに描画されますので、普通に描画すると重なった下の部分が隠れてしまいます。不透明度を設定することで、重なった部分も見えるようになります。ここでは不透明度を30%に設定しています。

// 不透明度を設定します(%で指定、0で完全に透明)
watermark.setOpacity(30);
不透明度を設定する

回転を設定する

回転を設定して、文字を斜めに表示することもできます。ここでは回転角度を -55度で設定しています。

// 回転を設定します(1/100度で指定)
watermark.setRotation(-5500);
回転を設定する

イメージを設定する

冒頭で触れたように、透かしの外観はシーオーリポーツの描画オブジェクトで作成できますので、テキストのかわりにイメージを使うことも可能です。

// ページ中央に透かしを挿入します
var width = 6560;
var height = 4010;
var startX = form.getPaperWidth() / 2 - width / 2;
var startY = form.getPaperLength() / 2 - height / 2;            
var image = new CrImage("HOS.png", startX, startY, width, height);
image.setFrame(false);
var watermark = new CrWatermark(image);
// 不透明度を設定します(%で指定、0で完全に透明)
watermark.setOpacity(60);
doc.addWatermark(watermark);
イメージを設定する

透かしを敷きつめる

透かしは何個でも設定できますので、このようにたくさん並べて敷きつめることも可能です。(やりすぎると重くなりますが)

// 透かしをページ内に敷きつめます
var width = 3280;
var height = 2005;
var margin = 2000;

for (var startX = -width / 2; startX < form.getPaperWidth(); startX += width + margin) {
    for (var startY = -height / 2; startY < form.getPaperLength(); startY += height + margin) {
        var image = new CrImage("HOS.png", startX, startY, width, height);
        image.setFrame(false);
        var watermark = new CrWatermark(image);
        // 不透明度を設定します(%で指定、0で完全に透明)
        watermark.setOpacity(20);
        // 回転します(1/100度で指定)
        watermark.setRotation(3000);                    
        doc.addWatermark(watermark);
    }
}
透かしを敷きつめる

透かしを入れるページを指定する

デフォルトでは、透かしは帳票のすべてのページに挿入されます。しかし、「最初のページだけ入れたい」「特定のページでは表示する透かしを変えたい」などのご要望があるかもしれません。ページフィルタを使用すると、透かしをどのページに設定するかを指定することができます。以下の例では、奇数ページのみ透かしを設定するようにしています。

// ページフィルタで透かしを設定するページを指定します
watermark.setPageFilter(pageNo -> pageNo % 2 != 0);
透かしを入れるページを指定する

最後に

いかがでしたか?


今回の動作は体験版でも確認することができます。是非こちらからダウンロードして試してみてください!