ImageAlignment.cs
//
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
namespace DsPdfWeb.Demos
{
// DsPdfの画像整列オプションの使用例を示すサンプルです。
// このサンプルは、以前「Raw画像」という題名で公開されていた、
// RawImageクラスを使用し、JPEG画像をドキュメントに追加するデモの代替です。
// RawImageクラスは現在も使用可能ですが、将来的に廃止される予定のため、
// ImageAlignクラスでの画像整列オプションを使用することをお勧めします。
//注意:DsPdfで同じ画像を複数回レンダリングする場合
//(例:全ページのヘッダーとして同じ画像を描画する場合など)、
//同じ画像オブジェクトを使うと、その画像は自動的にDsPdf内部の
//ディクショナリに登録され、ドキュメント全体で再利用されます。
//そのため、毎回ファイル(またはストリーム)から同じ画像を読み込むのではなく、
//一度画像を読み込んで、画像オブジェクトとしてキャッシュすることが推奨されます。
//(この仕組みはDsPdfで扱うすべての画像タイプに適用されます。)
public class ImageAlignment
{
public int CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
// キャプション描画用のテキストフォーマットを設定します:
var tf = new TextFormat() { FontName = "IPAGothic", FontSize = 12 };
void drawImage(GCDRAW.Image image_, Page page_, ImageAlign ia_, bool clip_)
{
var rect = new RectangleF(72, 72, 72 * 4, 72 * 4);
var clipped = clip_ ? "4×4インチの矩形に切り取り" : "切り取りなし";
var align = ia_ == ImageAlign.Default ? "規定の配置" :
ia_ == ImageAlign.CenterImage ? "中央寄せ" :
ia_ == ImageAlign.StretchImage ? "矩形にあわせる" : "カスタム";
// イメージキャプションを描画します:
page_.Graphics.DrawString($"{doc.Pages.IndexOf(page_) + 1}ページ: 画像の場所 (1\",1\"), {clipped}, 配置 {align}:", tf, new PointF(72, 36));
var clip = clip_ ? new Nullable<RectangleF>(rect) : new Nullable<RectangleF>();
// イメージを描画します:
page_.Graphics.DrawImage(image_, rect, clip, ia_, out RectangleF[] imageRects);
// 画像のアウトラインを表示します:
page_.Graphics.DrawRectangle(imageRects[0], Color.Red, 1, null);
// 画像、クリップ領域を表示する:
page_.Graphics.DrawRectangle(rect, Color.Blue, 1, null);
}
// JPEGからイメージを作成する
//(ここで Image クラスのインスタンスを一度作成して、それを使い回して PDF に画像を描画することで、
//画像データが再利用できます。PDFに同じ画像が重複して埋め込まれることはありません):
using var image = GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "puffins.jpg"));
using var imageSmall = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "puffins-small.jpg"));
// ImageAlignクラスは、さまざまな画像整列オプションを提供します。
// よく使われるオプションは、静的インスタンスで定義されています。
// 以下の例を参照してください。
// ページ 1: 既定の配置(Default)に、画像を切り抜かず描画する:
drawImage(image, doc.NewPage(), ImageAlign.Default, false);
// ページ 2: 既定の配置(Default)に、画像を切り抜いて描画する:
drawImage(image, doc.NewPage(), ImageAlign.Default, true);
// ページ 3: 中央(CenterImage)に、画像を切り抜いてで描画:
drawImage(image, doc.NewPage(), ImageAlign.CenterImage, true);
// ページ 4: 枠いっぱいに引き伸ばして(StretchImage)、画像を切り抜かずに描画:
drawImage(image, doc.NewPage(), ImageAlign.StretchImage, false);
//以下のようにインスタンスを作成することで、細かいカスタム設定も可能です。
// ページ 5: クリッピング無し、画像を枠内に収め、縦横比を保って描画:
var ia = new ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, true, true, true, false, false);
drawImage(image, doc.NewPage(), ia, false);
// ページ 6: 小さい画像を、クリッピング無し、画像を枠内に収め、縦横比を保って、タイル状に並べて描画:
ia = new ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, false, false, true, true, true);
drawImage(imageSmall, doc.NewPage(), ia, false);
// PDF ドキュメントを保存します。
doc.Save(stream);
return doc.Pages.Count;
}
}
}