InlineImages.cs
// 完毕:
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
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.Basics
{
// 此示例展示了如何插入任意对象(此示例中的图像)
// 到文本块中,以便这些对象保持其相对位置
// 到周围的文本,并且布局与其他文本运行完全相同,
// 并可以参与文本流。
public class InlineImages
{
public int CreatePDF(Stream stream)
{
// 获取用作内联对象的图像:
using (var imgPuffins = GCDRAW.Image.FromFile("Resources/ImagesBis/puffins-small.jpg"))
using (var imgFerns = GCDRAW.Image.FromFile("Resources/ImagesBis/ferns-small.jpg"))
{
// 要使用的图像对齐:
var ia = new ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Bottom, true, true, true, false, false);
// 创建并设置文档:
var doc = new GcPdfDocument();
var page = doc.NewPage();
var g = page.Graphics;
// 创建并设置一个 TextLayout 对象来打印文本:
var tl = g.CreateTextLayout();
tl.MaxWidth = page.Size.Width;
tl.MaxHeight = page.Size.Height;
tl.MarginLeft = tl.MarginRight = tl.MarginTop = tl.MarginBottom = 36;
tl.DefaultFormat.Font = StandardFonts.Times;
tl.DefaultFormat.FontSize = 12;
tl.DefaultFormat.BackColor = Color.LightGoldenrodYellow;
tl.TextAlignment = TextAlignment.Justified;
// 使用图像和任意大小创建内联对象:
var ioPuffins = new InlineObject(imgPuffins, 36, 24);
var ioFerns = new InlineObject(imgFerns, 36, 24);
// 构建文本:
tl.Append("TextLayout 类的“内联对象”功能允许插入任意对象" +
"");
tl.Append("这里有一些海雀:");
tl.Append(ioPuffins);
tl.Append("这里有一些蕨类植物:");
tl.Append(ioFerns);
tl.Append("结束。");
//
System.Diagnostics.Debug.Assert(tl.InlineObjects.Count == 0, "InlineObjects is filled by RecalculateGlyphs");
// 此方法获取并测量渲染文本所需的字形,
// 因为我们用不同的布局多次绘制相同的文本,
// 我们在下面的循环之前调用一次:
tl.RecalculateGlyphs();
//
System.Diagnostics.Debug.Assert(tl.InlineObjects.Count == 2, "InlineObjects is filled by RecalculateGlyphs");
// 在循环中,在 3 个不同的位置绘制文本和内嵌图像
// 和页面上的边界:
for (int i = 0; i < 3; ++i)
{
tl.MarginTop = tl.ContentRectangle.Bottom + 36;
tl.MarginLeft = 36 + 72 * i;
tl.MarginRight = 36 + 72 * i;
// 注意这里传递“false”,我们不需要重新计算字形,因为
// 文本没有改变:
tl.PerformLayout(false);
// 绘制文本和图像:
g.DrawTextLayout(tl, PointF.Empty);
foreach (var io in tl.InlineObjects)
g.DrawImage((GCDRAW.Image)io.Object, io.ObjectRect.ToRectangleF(), null, ia);
}
// 完毕:
doc.Save(stream);
return doc.Pages.Count;
}
}
}
}