using Aspose.Words.Rendering; using BLL; using BLL.Common; using Model; using Newtonsoft.Json.Linq; using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using UglyToad.PdfPig; using UglyToad.PdfPig.Content; using UglyToad.PdfPig.Writer; namespace FineUIPro.Web.HJGL.DataIn { public partial class DrawingRecognitionContent : PageBase { public string URL { get { return (string)ViewState["URL"]; } set { ViewState["URL"] = value; } } public string fileUrl { get { return (string)ViewState["fileUrl"]; } set { ViewState["fileUrl"] = value; } } public DataTable dt { get { return (DataTable)ViewState["DataTable"]; } set { ViewState["DataTable"] = value; } } public DataTable dtOther { get { return (DataTable)ViewState["dtOther"]; } set { ViewState["dtOther"] = value; } } public DataTable dtIsoInfo { get { return (DataTable)ViewState["dtIsoInfo"]; } set { ViewState["dtIsoInfo"] = value; } } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (!string.IsNullOrEmpty(Request.Params["fileUrl"])) { URL = Funs.SGGLUrl + Request.Params["fileUrl"].Replace("\\", "/"); string rootPath = Server.MapPath("~/"); fileUrl = rootPath + Request.Params["fileUrl"]; // 加载PDF文档 if (!File.Exists(fileUrl)) { return; } } } } protected void btnSave_Click(object sender, EventArgs e) { Grid1.Hidden = true; contentPanel1.Hidden =false ; string rootPath = Server.MapPath("~/"); Dictionary> dic= new Dictionary>(); foreach (DataRow row in dt.Rows) { if (!dic.ContainsKey(row["pipe_no"].ToString())) { dic.Add(row["pipe_no"].ToString().Trim(),new List()); } dic[row["pipe_no"].ToString().Trim()].Add(int.Parse(row["page_no"].ToString())); } using (var pdf = PdfDocument.Open(fileUrl)) { for (int i = 0; i < pdf.NumberOfPages; i++) { var page = pdf.GetPage(i + 1); var rotation = page.Rotation; string outputPath = ""; string isono = ""; foreach (string key in dic.Keys) { if (dic[key].IndexOf(i + 1) >= 0) { isono = key; outputPath = $"{rootPath}/File/PDF/Pipe/" + key; if (!Directory.Exists(outputPath)) { Directory.CreateDirectory(outputPath); } string fileName = key; var row = dtOther.Select(" page='" + (i + 1) + "' and region_type='C' ").FirstOrDefault(); if (row != null) { if (!string.IsNullOrEmpty(row["text"].ToString())) { fileName = row["text"].ToString(); } } outputPath = $"{outputPath}/" + fileName + DateTime.Now.ToString("yyyyMMddHHmm") + ".pdf"; } } using (var writer = new PdfDocumentBuilder()) { PdfPageBuilder newPage = null; if (rotation.Value != 0 && rotation.Value != 180) { newPage = writer.AddPage(page.Height, page.Width); } else { newPage = writer.AddPage(page.Width, page.Height); } newPage.CopyFrom(page); // 3. 关键:清除旋转标记 + 反向旋转内容(修正视觉方向) // 清除 /Rotate 标记 newPage.SetRotation(new PageRotationDegrees(rotation.Value)); var newPdf = writer.Build(); File.WriteAllBytes(outputPath, newPdf); var isoInfo = Funs.DB.HJGL_Pipeline.FirstOrDefault(x => x.PipelineCode == isono && x.ProjectId==CurrUser.LoginProjectId); if (isoInfo != null) { Regex NumberRegex = new Regex(@"\d+\.?\d*"); DataRow[] rows = dt.Select(" pipe_no='" + isono + "' and category='PIPE'"); if (rows != null && rows.Length > 0) { //string description = rows[0]["description"].ToString(); //if (!isoInfo.ISO_Dia.HasValue || !isoInfo.ISO_Sch.HasValue || string.IsNullOrEmpty(isoInfo.MaterialStandardId)) //{ // string res = OpenAIhelper.ChatCompletion("请根据 " + description + ",识别外径,壁厚,材质标准(请严格按照国家标准返回),结果仅以JSON格式返回,不要解释,不要多余文字,不要markdown,例如 {\r\n \"外径\": \"33.4 mm\",\r\n \"壁厚\": \"6.35 mm\",\r\n \"材质标准\": \"GB/T 9948\"\r\n}"); // ErrLogInfo.WriteLog(res); // JObject jobject = JObject.Parse(res); // string dia = jobject.Value("外径"); // string sch = jobject.Value("壁厚"); // string materialStandard = jobject.Value("材质标准"); // MatchCollection matchCollection1 = NumberRegex.Matches(dia); // foreach (var match in matchCollection1) // { // // 使用 TryParse 确保转换安全,避免异常 // if (decimal.TryParse(match.ToString(), out decimal number)) // { // isoInfo.ISO_Dia = number; // } // } // MatchCollection matchCollection2 = NumberRegex.Matches(sch); // foreach (var match in matchCollection2) // { // // 使用 TryParse 确保转换安全,避免异常 // if (decimal.TryParse(match.ToString(), out decimal number)) // { // isoInfo.ISO_Sch = number; // } // } // isoInfo.MaterialStandardId = Funs.DB.HJGL_BS_MaterialStandard.Where(x => x.MaterialStandardCode == materialStandard).Select(x => x.MaterialStandardId).FirstOrDefault(); //} //decimal length = 0; //foreach (DataRow row in rows) //{ // MatchCollection matches = NumberRegex.Matches(row["qty"].ToString()); // foreach (var match in matches) // { // // 使用 TryParse 确保转换安全,避免异常 // if (decimal.TryParse(match.ToString(), out decimal number)) // { // length += number; // } // } //} //isoInfo.PipeLineLength = length; } //DataRow[] rowsPipe = dtIsoInfo.Select(" pipeline_id='" + isono + "' "); //if (rowsPipe != null && rowsPipe.Length > 0) //{ // string isNeedHead = rowsPipe[0]["post_weld_heat_treatment"].ToString(); // if (isNeedHead == "N") // { // isoInfo.IsHot = "0"; // isoInfo.IsHotType = null; // } // else // { // isoInfo.IsHot = "1"; // } //} Funs.DB.SubmitChanges(); //保存文件到附件 UploadFileService.SaveAttachUrl(UploadFileService.GetSourceByAttachUrl(outputPath.Replace(rootPath, ""), 10, null), outputPath.Replace(rootPath, ""), Const.HJGL_PipelineMenuId, isoInfo.PipelineId); } } } } } public static string HeaderCorrespondence(string uploadUrl, string data, string method, string contenttype) { // 5. 创建HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uploadUrl); request.Method = string.IsNullOrEmpty(method) ? "GET" : method; request.ContentType = string.IsNullOrEmpty(contenttype) ? "application/json;charset=utf-8" : contenttype; if (uploadUrl.IndexOf("https") >= 0) { request.ProtocolVersion = HttpVersion.Version10; } if (!string.IsNullOrEmpty(data)) { Stream RequestStream = request.GetRequestStream(); byte[] bytes = Encoding.UTF8.GetBytes(data); RequestStream.Write(bytes, 0, bytes.Length); RequestStream.Close(); } HttpWebResponse response = null; Stream ResponseStream = null; StreamReader StreamReader = null; try { response = (HttpWebResponse)request.GetResponse(); ResponseStream = response.GetResponseStream(); StreamReader = new StreamReader(ResponseStream, Encoding.GetEncoding("utf-8")); string re = StreamReader.ReadToEnd(); StreamReader.Close(); ResponseStream.Close(); return re; } catch (WebException ex) { response = (HttpWebResponse)ex.Response; ResponseStream = response.GetResponseStream(); StreamReader = new StreamReader(ResponseStream, Encoding.GetEncoding("utf-8")); string re = StreamReader.ReadToEnd(); return re; } finally { if (StreamReader != null) { StreamReader.Close(); } if (ResponseStream != null) { ResponseStream.Close(); } if (response != null) { response.Close(); } } } protected void btnAudit_Click(object sender, EventArgs e) { Grid1.Hidden = false; contentPanel1.Hidden = true; btnAudit.Hidden = true; btnSave.Hidden = false; if (!string.IsNullOrEmpty(resultdata.Value)) { JObject jobject = JObject.Parse(resultdata.Value); JArray jArray = jobject.Value("material_rows"); JArray jArrayOther = jobject.Value("other_regions"); JArray jArrayIsoInfo = jobject.Value("drawing_info"); dt = new DataTable(); dt.Columns.Add("id"); dt.Columns.Add("pipe_no"); dt.Columns.Add("drawing_number"); dt.Columns.Add("seq_no"); dt.Columns.Add("category"); dt.Columns.Add("description"); dt.Columns.Add("spec"); dt.Columns.Add("qty"); dt.Columns.Add("code"); dt.Columns.Add("page_no"); dt.Columns.Add("remark"); dtOther = new DataTable(); dtOther.Columns.Add("id"); dtOther.Columns.Add("region_type"); dtOther.Columns.Add("region_label"); dtOther.Columns.Add("page"); dtOther.Columns.Add("text"); dtIsoInfo = new DataTable(); dtIsoInfo.Columns.Add("id"); dtIsoInfo.Columns.Add("page_no"); dtIsoInfo.Columns.Add("drawing_number"); dtIsoInfo.Columns.Add("pipeline_id"); dtIsoInfo.Columns.Add("operation_pressure_mpa"); dtIsoInfo.Columns.Add("operation_temp_c"); dtIsoInfo.Columns.Add("design_pressure_mpa"); dtIsoInfo.Columns.Add("design_temp_c"); dtIsoInfo.Columns.Add("test_pressure_mpa"); dtIsoInfo.Columns.Add("hydraulic_test_pressure"); dtIsoInfo.Columns.Add("pipe_diameter_dn"); dtIsoInfo.Columns.Add("pipe_spec_grade"); dtIsoInfo.Columns.Add("heat_insulation"); dtIsoInfo.Columns.Add("insulation_thickness_mm"); dtIsoInfo.Columns.Add("post_weld_heat_treatment"); dtIsoInfo.Columns.Add("radiographic_examination"); foreach (JObject item in jArrayOther) { var row = dtOther.NewRow(); row["id"] = item.Value("id"); row["region_type"] = item.Value("region_type"); row["region_label"] = item.Value("region_label"); row["page"] = item.Value("page"); row["text"] = item.Value("text"); dtOther.Rows.Add(row); } foreach (JObject item in jArrayIsoInfo) { var row = dtIsoInfo.NewRow(); row["id"] = item.Value("id"); row["page_no"] = item.Value("page_no"); row["drawing_number"] = item.Value("drawing_number"); row["pipeline_id"] = item.Value("pipeline_id"); row["operation_temp_c"] = item.Value("operation_temp_c"); row["design_pressure_mpa"] = item.Value("design_pressure_mpa"); row["design_temp_c"] = item.Value("design_temp_c"); row["test_pressure_mpa"] = item.Value("test_pressure_mpa"); row["hydraulic_test_pressure"] = item.Value("hydraulic_test_pressure"); row["pipe_diameter_dn"] = item.Value("pipe_diameter_dn"); row["pipe_spec_grade"] = item.Value("pipe_spec_grade"); row["heat_insulation"] = item.Value("heat_insulation"); row["insulation_thickness_mm"] = item.Value("insulation_thickness_mm"); row["post_weld_heat_treatment"] = item.Value("post_weld_heat_treatment"); row["radiographic_examination"] = item.Value("radiographic_examination"); dtIsoInfo.Rows.Add(row); } // 遍历并提取数据 foreach (JObject item in jArray) { var row = dt.NewRow(); row["id"] = item.Value("id"); row["pipe_no"] = item.Value("pipe_no"); row["drawing_number"] = item.Value("drawing_number"); row["code"] = item.Value("code"); row["seq_no"] = item.Value("seq_no"); row["category"] = item.Value("category"); row["description"] = item.Value("description"); row["spec"] = item.Value("spec"); row["qty"] = item.Value("qty"); row["page_no"] = item.Value("page_no"); row["remark"] = item.Value("remark"); if (string.IsNullOrEmpty(row["drawing_number"].ToString())) { var rowOther = dtOther.Select("page= " + row["page_no"].ToString()).FirstOrDefault(); row["drawing_number"] = rowOther["text"]; } dt.Rows.Add(row); } BindGrid(); } } private void BindGrid() { Grid1.DataSource = dt; Grid1.DataBind(); } #region 双击事件 /// /// Grid行双击事件 /// /// /// protected void Grid1_RowDoubleClick(object sender, GridRowClickEventArgs e) { if (Grid1.SelectedRowIndexArray.Length == 0) { Alert.ShowInTop("请选择一条记录!", MessageBoxIcon.Warning); return; } if (CommonService.GetAllButtonPowerList(this.CurrUser.LoginProjectId, this.CurrUser.PersonId, Const.HJGL_DataInMenuId, Const.BtnAdd)) { if (DrawingRecognitionContentEdit.dicDt.ContainsKey(CurrUser.PersonId)) { DrawingRecognitionContentEdit.dicDt[CurrUser.PersonId] = dt; } else { DrawingRecognitionContentEdit.dicDt.Add(CurrUser.PersonId, dt); } PageContext.RegisterStartupScript(Window1.GetSaveStateReference(hdIds.ClientID) + Window1.GetShowReference(String.Format("DrawingRecognitionContentEdit.aspx?Index={0}", Grid1.SelectedRowIndex, "编辑 - "))); //PageContext.RegisterStartupScript(Window1.GetShowReference(String.Format("DrawingRecognitionContentEdit.aspx?Index={0}", Grid1.SelectedRowIndex, "维护 - "))); } else { ShowNotify("您没有这个权限,请与管理员联系!", MessageBoxIcon.Warning); } } #endregion protected void Window1_Close(object sender, WindowCloseEventArgs e) { Grid1.DataSource = dt; Grid1.DataBind(); } } }