PageFormXObject.cs
//
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Numerics;
using System.Collections.Generic;
using System.Linq;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Annotations;
using GrapeCity.Documents.Pdf.Graphics;
namespace DsPdfWeb.Demos
{
// このサンプルは、一時的な GcPdfDocument に読み込まれた PDF から
// ページを表す FormXObject を作成し、そのオブジェクトを現在のドキュメントに
// 描画する方法を示します。
public class PageFormXObject
{
public int CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
var page = doc.NewPage();
var g = page.Graphics;
var rc = Common.Util.AddNote(
"下のサムネイルは既存の文書からのページを表します。" +
"任意の PDF を一時的な GcPdfDocument に読み込み、その各ページを" +
"表す FormXObject を作成し、それらのオブジェクトを現在の文書に" +
"サムネイルとしてレンダリングします。同じ FormXObject を複数回" +
"使用できることを示すために、ミラー変換を適用して各サムネイルを" +
"2回レンダリングします。",
page);
// レイアウトのパラメータ。
var margin = rc.Left;
var pad = 36;
var side = (page.Size.Width - margin * 2 - pad) / 2;
var ip = new PointF(margin, rc.Bottom + pad);
// ミラー変換。
var tr = Matrix3x2.CreateScale(-1, 1) * Matrix3x2.CreateTranslation(page.Size.Width, 0);
// オーバーレイされたページキャプションのテキスト形式です。
var color = Color.DarkRed;
var tf = new TextFormat()
{
Font = StandardFonts.HelveticaBold,
FontSize = 16,
ForeColor = Color.FromArgb(128, color),
};
// 任意の PDF を開き、それを一時的なドキュメントに読み込んでページをループし、
// それぞれを現在のドキュメントに描画します。
using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "Wetlands.pdf"));
var doc1 = new GcPdfDocument();
doc1.Load(fs);
// 読み込まれた PDF のページ用の FormXObject のリストを作成します。
var fxos = new List<FormXObject>();
doc1.Pages.ToList().ForEach(p_ => fxos.Add(new FormXObject(doc, p_)));
// 現在のドキュメント内にサムネイルを描画します。
for (int i = 0; i < fxos.Count; ++i)
{
if (ip.Y + side > page.Size.Height - margin)
{
page = doc.NewPage();
g = page.Graphics;
ip = new PointF(margin, margin);
}
var rcfx = new RectangleF(ip.X, ip.Y, side, side);
// そのまま描画します。
g.DrawForm(fxos[i], rcfx, null, ImageAlign.ScaleImage);
g.DrawRectangle(rcfx, color);
g.DrawString($"Page {i + 1}", tf, rcfx, TextAlignment.Center, ParagraphAlignment.Center, false);
// 反転して描画します。
g.Transform = tr;
g.DrawForm(fxos[i], rcfx, null, ImageAlign.ScaleImage);
g.DrawRectangle(rcfx, color);
g.Transform = Matrix3x2.Identity;
rcfx.Offset(side + pad, 0);
g.DrawString($"Reversed page {i + 1}", tf, rcfx, TextAlignment.Center, ParagraphAlignment.Center, false);
//
ip.Y += side + pad;
}
// PDF ドキュメントを保存します。
doc.Save(stream);
return doc.Pages.Count;
}
}
}