xps文档节点序列化,节点排序
生活随笔
收集整理的這篇文章主要介紹了
xps文档节点序列化,节点排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
測試之前解析XPS文檔的時候,出現的解析XpsDocument的節點不結構化問題,實驗了很多解決方案都失敗了,在LINQ和lambda表達式按多個字段排序上得到啟發,找到解決辦法。解決方案如下: (1)根據XpsDocument每個Glyphs節點的比例值、偏移量等屬性重新計算該節點實際的X,Y坐標; (2)將計算好的X,Y坐標和節點值存到類; (3)按照Y坐標先分組后排序,按照X坐標先分組后排序,然后保存到集合中; (4)遍歷集合,按指定格式輸出節點內容。 代碼如下: 1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Text;
6 using System.Windows.Xps.Packaging;
7 using System.Xml;
8 using System.Xml.Serialization;
9
10 namespace 自助打印機工作站
11 {
12 class XpsOperationClass
13 {
14 public static String GetXpsText(string strPath)
15 {
16 string strXml = "";
17 try
18 {
19 #region 獲取數據
20 XmlConfig config = new XmlConfig();
21 XpsDocument xpsDocument = new XpsDocument(strPath, FileAccess.Read);
22 var reader = xpsDocument.FixedDocumentSequenceReader;
23 foreach (var document in reader.FixedDocuments)
24 {
25 foreach (var page in document.FixedPages)
26 {
27 XmlReader xrdr = page.XmlReader;
28
29 while (xrdr.Read())
30 {
31 switch (xrdr.NodeType)
32 {
33 case XmlNodeType.Element:
34 if (xrdr.Name == "Glyphs")
35 {
36 ConfigItem conitem = new ConfigItem();
37 conitem.OriginX = Convert.ToDouble(xrdr["OriginX"]);
38 conitem.OriginY = Convert.ToDouble(xrdr["OriginY"]);
39 //獲取比例值
40 conitem.RenderTransform = xrdr["RenderTransform"] ?? "1";
41 //獲取比例值
42 conitem.RenderTrans = Convert.ToDouble(conitem.RenderTransform.Split(',')[0]);
43 //檢查是否存儲了相似的 Y值,因為后期輸出的與原值 有偏差,偏差不大
44 double pcvalue = 8d;//上下偏差值
45 ConfigItem tempItem = config.Params.Find(q => q.OriginYrms < conitem.OriginY * conitem.RenderTrans + pcvalue && q.OriginYrms > conitem.OriginY * conitem.RenderTrans - pcvalue);
46 //如果有就取原值,利用原值下面將分組,設置相同以后才能確定是同一行
47 if (tempItem != null)
48 {
49 conitem.OriginYrms = tempItem.OriginYrms;
50 }
51 else
52 {
53 //如果沒有設置新的 與比例相乘,得到正常的值的Y
54 conitem.OriginYrms = conitem.OriginY * conitem.RenderTrans;
55 }
56 //與比例相乘,得到正常的值的X
57 conitem.OriginXrms = conitem.OriginX * conitem.RenderTrans;
58 conitem.UnicodeString = xrdr["UnicodeString"];
59 config.Params.Add(conitem);
60 }
61 break;
62 default: break;
63 }
64 }
65 xrdr.Close();
66 }
67 }
68 xpsDocument.Close();
69 #endregion
70 #region 排序數據
71 //創建新的 配置文件對象
72 XmlConfig sortConfig = new XmlConfig();
73 //先分組,等同于分行,將所有的行分開
74 var groupParam = config.Params.GroupBy(p => p.OriginYrms)
75 .Select(g => new { ConfigItemList = g.ToList(), count = g.Count(), Key = g.Key }).ToList();
76 //排序,正序,即:第一行、第二行、第三行。。。。。
77 foreach (var gp in groupParam.OrderBy(p => p.Key))
78 {
79 //排序獲取列,即:第一列、第二列。。。。。。
80 List<ConfigItem> paramorder = gp.ConfigItemList.OrderBy(p => p.OriginXrms).ToList();
81 foreach (var item in paramorder)
82 {
83 sortConfig.Params.Add(item);//將內容填充到新的對象中
84 }
85 }
86
87 foreach (ConfigItem item in sortConfig.Params)
88 {
89 if (item.UnicodeString.IndexOf(":") >= 0 || item.UnicodeString.IndexOf(":") >= 0)
90 {
91 //原始內容
92 strXml += item.UnicodeString;
93 }
94 else
95 {
96 strXml += item.UnicodeString + " ";
97 }
98 }
99 #endregion
100 }
101 catch (Exception ex)
102 {
103 strXml = string.Empty;
104 }
105 return strXml;
106 }
107 }
108 public class XmlConfig
109 {
110
111 public XmlConfig()
112 {
113 Params = new List<ConfigItem>();
114 }
115 [XmlElement("Glyphs")]
116 public List<ConfigItem> Params { get; set; }
117 }
118 public class ConfigItem //: IComparable
119 {
120 [XmlText]
121 public string Value { get; set; }
122 [XmlAttribute("RenderTransform")]
123 public string RenderTransform { get; set; }
124 /// <summary>
125 /// 縮放比例
126 /// </summary>
127 [XmlIgnore]
128 public double RenderTrans { get; set; }
129 [XmlAttribute("Fill")]
130 public string Fill { get; set; }
131 [XmlAttribute("FontUri")]
132 public string FontUri { get; set; }
133 [XmlAttribute("FontRenderingEmSize")]
134 public string FontRenderingEmSize { get; set; }
135 [XmlAttribute("StyleSimulations")]
136 public string StyleSimulations { get; set; }
137 [XmlAttribute("OriginX")]
138 public double OriginX { get; set; }
139 /// <summary>
140 /// 計算正常比例 X
141 /// </summary>
142 [XmlAttribute("OriginXrms")]
143 public double OriginXrms { get; set; }
144 /// <summary>
145 /// 計算正常比例 Y
146 /// </summary>
147 [XmlAttribute("OriginY")]
148 public double OriginY { get; set; }
149 [XmlAttribute("OriginYrms")]
150 public double OriginYrms { get; set; }
151 [XmlAttribute("Indices")]
152 public string Indices { get; set; }
153 [XmlAttribute("UnicodeString")]
154 public string UnicodeString { get; set; }
155
156 }
157 } View Code
?
轉載于:https://www.cnblogs.com/libj/p/6060842.html
總結
以上是生活随笔為你收集整理的xps文档节点序列化,节点排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Alpha阶段发布说明
- 下一篇: iOS 10 消息推送(UserNoti