WPFを使用してPower Pointシリーズを作成するOpen XML解析に基づくPPTテキストのストローク効果

WPFを使用してPower Pointシリーズを作成するOpen XML解析に基づくPPTテキストのストローク効果

この記事は、Power PointブログシリーズのWPFを使用して、PPT内のテキストストローク効果を解析し、WPFアプリケーションで描画し、同じピクセルレベルを達成する方法を示します。

最后更新 2021/12/18 18:24
lindexi
预计阅读 5 分钟
分类
WPF
标签
.NET WPF OpenXML

この記事は、Power PointブログシリーズのWPFを使用して、PPT内のテキストストローク効果を解析し、WPFアプリケーションで描画し、同じピクセルレベルを達成する方法を示します。

バックグラウンド知識

在开始之前,期望你了解了 PPT 解析的入门知识。如对 PPT 解析了解很少,请参阅 C# dotnet 使用 OpenXml 解析 PPT 文件

PPTでは、テキストの一部のテキストに線効果を設定することができます。線効果はOpen XMLレイヤー上の特殊効果ではなく、境界線属性です。PPTでは、テキストに境界線プロパティを追加して線を引くことができます。

効果は

始める前に、効果を見てください。

解析する。

始める前に、以下のコードを読み取ります。以下のコードとテストファイルは、この記事の最後で入手できます。

var file = new FileInfo("Test.pptx");

using var presentationDocument = PresentationDocument.Open(file.FullName, false);
var slide = presentationDocument.PresentationPart!.SlideParts.First().Slide;

以下のコードでは、コア部分のロジックを簡単に伝えるために、Test.pptxドキュメントに従って多くのパラメータを無視します。実際のプロジェクトでは、パラメータ判断ロジックも自分で行ってください。

このテストドキュメントには、最初のページに1つの要素があります。この記事のテキスト線要素です。

var shape = slide.CommonSlideData!.ShapeTree!.GetFirstChild<Shape>()!;

このShapeのOpenXMLコンテンツは以下の通りです。

<p:sp>
<p:spPr>
    <a:prstGeom prst="rect">
    </a:prstGeom>
    <a:noFill />
</p:spPr>
<p:txBody>
    <a:bodyPr wrap="square" rtlCol="0">
    <a:spAutoFit />
    </a:bodyPr>
    <a:lstStyle />
    <a:p>
    <a:r>
        <a:rPr lang="zh-CN" altLang="en-US" sz="10000">
        <a:ln w="9525">
            <a:solidFill>
            <a:srgbClr val="00FF00" />
            </a:solidFill>
        </a:ln>
        </a:rPr>
        <a:t>一行文本</a:t>
    </a:r>
    <a:endParaRPr lang="en-US" sz="10000" dirty="0" />
    </a:p>
</p:txBody>
</p:sp>

PPT内のテキストボックスも形で、デフォルトの長方形です。

var shapeProperties = shape.ShapeProperties!;
var presetGeometry = shapeProperties.GetFirstChild<PresetGeometry>()!;
// 这是一个文本框
Debug.Assert(presetGeometry.Preset?.Value == ShapeTypeValues.Rectangle);
Debug.Assert(shapeProperties.GetFirstChild<NoFill>() is not null);

上記は、形状を取得する方法を示すだけで、自分のビジネスコードで判断する必要があります。

テキストボックスのテキストを取得するには、以下のコードを使用します。

var textBody = shape.TextBody!;
Debug.Assert(textBody != null);

テキスト内には多くの段落があり、段落内にはテキストが異なるスタイルがあります。段落は異なる太字のテキストを持つことができます。同じスタイルのテキストはTextRun内に配置されます。異なるテキストスタイルは異なるTextRunに配置されます。

そのため、構文解析には段落をトラバースし、TextRun要素をトラバースする必要がある。

foreach (var paragraph in textBody.Elements<DocumentFormat.OpenXml.Drawing.Paragraph>())
{
    // 这个文本段落是没有属性的,为了方便样式,就不写代码
    //if (paragraph.ParagraphProperties != null)

    foreach (var run in paragraph.Elements<DocumentFormat.OpenXml.Drawing.Run>())
    {
    }
}

TextRunのプロパティを取得します。

var runProperties = run.RunProperties!;

このプロパティは、現在のテキストサイズなどの情報を取得できます。

var fontSize = new PoundHundredfold(runProperties.FontSize!.Value).ToPound();

次に、この記事のコア、Outlineプロパティの取得、コードは次のとおりです。

var outline = runProperties.Outline!;

対応するOpenXMLコードは以下のとおりである

<a:ln w="9525">   <a:solidFill>
     <a:srgbClr val="00FF00" />
   </a:solidFill>
 </a:ln>

注目するのは太さと色だけで,それぞれの取得方法は以下の通りである.

var outlineWidth = new Emu(outline.Width!.Value);

色の取得コードは以下の通り。

var solidFill = outline.GetFirstChild<SolidFill>()!;
var rgbColorModelHex = solidFill.GetFirstChild<RgbColorModelHex>()!;
var colorText = rgbColorModelHex.Val!;

通过 win10 uwp 颜色转换 的方法可以将 colorText 转换为 SolidColorBrush 对象

テキストを再入力し、おそらく完了です。

// 默认字体前景色是黑色

var text = run.Text!.Text;

次に、インターフェイスを描きます。

描画する

WPF 文字描边 博客,先通过 FormattedText 构建出 Geometry 对象,再通过 Geometry 对象进行绘制

コードは以下の通り

var formattedText = new FormattedText(text, CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface
(
    // 默认是宋体
    new FontFamily("宋体"),
    FontStyles.Normal,
    FontWeights.Normal,
    FontStretches.Normal
),
// 在 WPF 里面,采用的是 EM 单位,约等于像素单位
    fontSize.ToPixel().Value,
Brushes.Black, 96);

FormattedTextからGeometryオブジェクトコードを構築する

var geometry = formattedText.BuildGeometry(new ());

次に、System. Windows.Shapes.Pathを介してGeometryをインタフェースに描画します。

var path = new System.Windows.Shapes.Path
{
    Data = geometry,
    Fill = Brushes.Black,
    Stroke = BrushCreator.CreateSolidColorBrush(colorText),
    StrokeThickness = outlineWidth.ToPixel().Value,

    HorizontalAlignment = HorizontalAlignment.Center,
    VerticalAlignment = VerticalAlignment.Center,
};

Root.Children.Add(path);

上記のコードを使用すると、PPTと同じインターフェースを描画できます。

コードコード。

本文所有代码和测试文件放在githubgitee 欢迎访问

この記事のソースコードは、まず空のフォルダを作成し、コマンドラインcdコマンドを使用して空のフォルダに入り、コマンドラインに次のコードを入力することで取得できます。

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 71af5b0e47493ff7f5f43be33583265805da9d84

上記はgiteeのソースを使用しています。giteeがアクセスできない場合は、githubのソースに置き換えてください。

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

コードを取得した後、Pptxフォルダに移動します。

リファレンス

  1. WPF 文字描边
  2. 更多请看 Office 使用 OpenXML SDK 解析文档博客目录

ブログパークのブログはバックアップを行うだけで、ブログが公開されると更新されません。最新のブログを見たい場合は、https://blog.lindexi.com/をご覧ください。

クリエイティブ·コモンズのライセンス契約

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2025/09/13

WPFからAvaloniaへの移行シリーズ:WPFプログラムをAvaloniaに移行する必要がある理由

ここ数年、当社のホストソフトウェアは主にWPFとWin Formで開発されてきました。これらのテクノロジーはWindowsプラットフォームで非常にうまく機能し、小規模なパイロット生産から今日の大規模なデリバリまでの段階を経てきました。しかし、ビジネスの成長と顧客のニーズの変化に伴い、単一のWindowsテクノロジースタックは私たちが乗り越えなければならないハードルになりました。

继续阅读
同分类 / 同标签 2025/01/26

WPFはカスタムXMLファイルで国際化を実現

この記事では、必要なNuGetパッケージのインストール、言語リストの動的取得、言語の動的切り替え、コードとxamlインターフェイスでの翻訳文字列の使用、開発者がWPFアプリケーションを簡単に国際化できるようにするソースコードへのリンクなど、WPFプログラムでカスタムXMLファイルを使用した国際化の方法について詳しく説明します。

继续阅读