SvgClipArt.cs
//
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Linq;
using System.Collections.Generic;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Svg;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
using DsPdfWeb.Demos.Common;
namespace DsPdfWeb.Demos
{
// GcSvgDocument を使用して、PDF ページに SVG ファイルをレンダリングします。
// このサンプルで使用している SVG アートは、freesvg.org のものです。
public class SvgClipArt
{
public int CreatePDF(Stream stream)
{
// フォルダから画像を読み込みます。
var images = new List<(string, GcSvgDocument)>();
foreach (var fname in Directory.GetFiles(Path.Combine("Resources", "SvgClipArt"), "*", SearchOption.AllDirectories))
images.Add((Path.GetFileName(fname), GcSvgDocument.FromFile(fname)));
images.Shuffle();
var doc = new GcPdfDocument();
// キャプションのフォントとフォーマットを指定します。
const float sMargin = 72f / 6;
var font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "segoeui.ttf"));
var tf = new TextFormat() { Font = font, FontSize = sMargin * 0.65f };
// 全周に 1/2 インチの余白がある 3x4 レイアウトのグリッドを設定します。
const float margin = 36;
const int rows = 4;
const int cols = 3;
float gapx = 72f / 4, gapy = gapx;
float sWidth = (doc.PageSize.Width - margin * 2 + gapx) / cols;
float sHeight = (doc.PageSize.Height - margin * 2 + gapy) / rows;
if (sWidth > sHeight)
{
gapx += sWidth - sHeight;
sWidth = sHeight;
}
else
{
gapy += sHeight - sWidth;
sHeight = sWidth;
}
var ip = new PointF(margin, margin);
// グリッド内にすべての画像をレンダリングし、必要に応じて新しいページを追加します。
var g = doc.NewPage().Graphics;
for (int i = 0; i < images.Count(); ++i)
{
// 画像の周囲にボーダーを描画します。
var rect = new RectangleF(ip, new SizeF(sWidth - gapx, sHeight - gapy));
g.FillRectangle(rect, Color.LightGray);
g.DrawRectangle(rect, Color.Black, 0.5f);
rect.Inflate(-sMargin, -sMargin);
// SVG を描画します。
var svg = images[i].Item2;
var s = svg.GetIntrinsicSize(SvgLengthUnits.Points);
if (s.Width > 0 && s.Height > 0)
{
// 画像の比率がターゲットの矩形と異なる場合、
// 矩形のサイズを変更し、画像を中央に配置します。
var qSrc = s.Width / s.Height;
var qTgt = rect.Width / rect.Height;
if (qSrc < qTgt)
rect.Inflate(rect.Width * (qSrc / qTgt - 1) / 2, 0);
else if (qSrc > qTgt)
rect.Inflate(0, rect.Height * (qTgt / qSrc - 1) / 2);
}
// SVGをレンダリングします。
g.DrawSvg(svg, rect);
// 画像ファイル名をキャプションとして下部の余白に出力します。
g.DrawString(Path.GetFileName(images[i].Item1), tf,
new RectangleF(rect.X, rect.Bottom, rect.Width, sMargin),
TextAlignment.Center, ParagraphAlignment.Near, false);
ip.X += sWidth;
if (ip.X + sWidth > doc.PageSize.Width && i < images.Count() - 1)
{
ip.X = margin;
ip.Y += sHeight;
if (ip.Y + sHeight > doc.PageSize.Height)
{
g = doc.NewPage().Graphics;
ip.Y = margin;
}
}
}
// PDF ドキュメントを保存します。
doc.Save(stream);
// PDF 保存後に画像を破棄します。
images.ForEach(t_ => t_.Item2.Dispose());
return doc.Pages.Count;
}
}
}