日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

xps文档节点序列化,节点排序

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文档节点序列化,节点排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。