網站首頁 編程語言 正文
安裝Openxml sdk
首先,我們先安裝nuget的需要的有關的Openxml sdk,我們開源了解析pptx的Openxml拍平層,下面兩種方式都可以安裝:
nuget包管理器控制臺:
Install-Package dotnetCampus.DocumentFormat.OpenXml.Flatten -Version 2.0.0
csproj引用:
<PackageReference Include="dotnetCampus.DocumentFormat.OpenXml.Flatten" Version="2.0.0" />
解析Pptx
我這里用PPTX的7種直線,分別設置7種能夠設置的虛線類型,PPTX的顯示效果是這樣的:
然后解析代碼如下,解析主要邏輯部分:
private void PptxToGeometry(string filePath) { if (!File.Exists(filePath) || !filePath.EndsWith(".pptx", StringComparison.OrdinalIgnoreCase)) { return; } var lines = new List<Line>(); using var presentationDocument = PresentationDocument.Open(filePath, false); var presentationPart = presentationDocument.PresentationPart; var presentation = presentationPart?.Presentation; var slideIdList = presentation?.SlideIdList; if (slideIdList == null) { return; } foreach (var slideId in slideIdList.ChildElements.OfType<SlideId>()) { var slidePart = (SlidePart)presentationPart.GetPartById(slideId.RelationshipId); var slide = slidePart.Slide; foreach (var shapeProperties in slide.Descendants<ShapeProperties>()) { var presetGeometry = shapeProperties.GetFirstChild<PresetGeometry>(); if (presetGeometry != null && presetGeometry.Preset.HasValue) { if (presetGeometry.Preset == ShapeTypeValues.StraightConnector1) { var transform2D = shapeProperties.GetFirstChild<Transform2D>(); var extents = transform2D?.GetFirstChild<Extents>(); if (extents != null) { var width = new Emu(extents.Cx!.Value).ToPixel().Value; var height = new Emu(extents.Cy!.Value).ToPixel().Value; var presetDash = shapeProperties.GetFirstChild<Outline>()?.GetFirstChild<PresetDash>()?.Val; var dashArray = GetDashArrayByPresetLineDashValues(presetDash); var line = ConverterToGeometry( width, height, dashArray); lines.Add(line); } } } } } this.ListBox.ItemsSource = lines; }
PPTX映射成WPF虛線的方法:
private DoubleCollection GetDashArrayByPresetLineDashValues(PresetLineDashValues presetLineDashValues) { DoubleCollection dashStyle = presetLineDashValues switch { PresetLineDashValues.Solid => new(), PresetLineDashValues.Dot => new() { 0, 2 }, PresetLineDashValues.Dash => new() { 3, 3 }, PresetLineDashValues.LargeDash => new() { 8, 3 }, PresetLineDashValues.DashDot => new() { 3, 3, 1, 3 }, PresetLineDashValues.LargeDashDot => new() { 7.5, 3.5, 1, 3.5 }, PresetLineDashValues.LargeDashDotDot => new() { 8, 3, 1, 3, 1, 3 }, PresetLineDashValues.SystemDash => new() { 3, 1 }, PresetLineDashValues.SystemDot => new() { 1, 1 }, PresetLineDashValues.SystemDashDot => new() { 2, 2, 0, 2 }, PresetLineDashValues.SystemDashDotDot => new() { 2, 2, 0, 2 }, _ => new DoubleCollection() }; return dashStyle; }
最終繪制線條的方法:
private Line ConverterToGeometry(double width, double height, DoubleCollection dashDoubleCollection) { var line = new Line { X1 = 0, Y1 = 0, X2 = width, Y2 = height, StrokeDashArray = dashDoubleCollection, Stroke = Stroke, StrokeThickness = StrokeThickness }; return line; }
最終的效果:
我們可以看到幾乎是接近的效果了,當然你也可以根據我的代碼去微調更精確的值,只需要稍微改下GetDashArrayByPresetLineDashValues
方法內相對應的值即可
后話
實際上,openxml文檔是給出了PresetDash的值的,大致如下:
但是其值跟WPF的設置Dash的DoubleCollection
不對應,因此以上的映射值都是我自己微調的
源碼
BlogCodeSample/PptDashConverToWpfSample at main · ZhengDaoWang/BlogCodeSample
原文鏈接:https://www.cnblogs.com/ryzen/p/15740488.html
相關推薦
- 2022-12-11 React組件的使用詳細講解_React
- 2022-09-16 Go語言入門學習之Channel通道詳解_Golang
- 2023-02-12 一文帶你了解Golang中reflect反射的常見錯誤_Golang
- 2023-05-17 Kotlin開發中open關鍵字與類名函數名和變量名的使用方法淺析_Android
- 2023-12-14 excel統計某個字符出現的次數,判斷某單元格的數據是否在另外一列
- 2022-06-17 一文輕松了解ASP.NET與ASP.NET?Core多環境配置對比_實用技巧
- 2022-11-06 python?基本結構語句(函數和模塊)_python
- 2022-03-14 IDEA 上傳文件 getRealpath("/upload)獲取不到文件上傳路徑問題
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支