诚然水晶报表已经能实现数据绑定以及一定的布局展示。但是具体格式会跟用户指定的WORD模板格式有出入。比如最简单的Table中字体溢出的换行展示。
客户对展示的格式有严格要求,精确到需要跟分享的WORD文件格式保持一致,没有任何偏差(打印出的pdf需要折叠成信件,信封需要用到地址,这里不允许有任何像素偏差)
基于此需求,选择了对word编辑并保存为pdf格式。
这里采用了 spire.doc中对书签的操作。
获取文档并获取书签和Table
1 //disability note template 2 Document document = new Document(); 3 document.LoadFromFile(Path.Combine(disTemplateFolder, @"Disability Note Template.docx")); 4 // 初始化BookmarkNavigator类对象 5 BookmarksNavigator navigator = new BookmarksNavigator(document); 6 Table table = document.Sections[0].Tables[0] as Table; 7 Section section = document.Sections[0];
Table添加一行新数据
1 TableRow row = new TableRow(document); 2 row = table.Rows[1].Clone(); 3 //ID,Claim#,Name,SS#,Birth Date,Claim Type,Eligible Until,Next Update Due 4 for (int i = 0; i < table.Rows[1].Cells.Count; i++) 5 { 6 TableCell tc = row.Cells[i]; 7 TableCell lastTc = table.Rows[1].Cells[i]; 8 Paragraph paragraph = tc.LastParagraph as Paragraph; 9 if (paragraph != null && !string.IsNullOrEmpty(paragraph.Text)) 10 { 11 switch (i) 12 { 13 default: paragraph.Text = ""; break; 14 case 0: paragraph.Text = "10"; break; 15 case 1: paragraph.Text = strClaimNumber; break;//need to generate Claim number 16 case 2: paragraph.Text = strName; break; 17 case 3: paragraph.Text = strSsnFormated; break; 18 case 4: paragraph.Text = strDobFormated; break; 19 case 5: paragraph.Text = update.dis_type; break; 20 case 6: paragraph.Text = strStartTime; break; 21 case 7: paragraph.Text = strEndTime; break; 22 case 8: paragraph.Text = strUpdateDueTime; break; 23 } 24 } 25 } 26 table.Rows.Add(row); 27 table.Rows.RemoveAt(1);
替换对应书签中的内容,这样就能保持字体以及段落格式一致(尤其定位一致)
1 replaceBookmark(navigator, "CreateDate", strCreateDate); 2 replaceBookmark(navigator, "Name", strName); 3 replaceBookmark(navigator, "StateAgencyCode", strAgencyCode); 4 //replaceBookmark(navigator, "StateAgencyName", ""); 5 replaceBookmark(navigator, "Staff", strStaff); 6 replaceBookmark(navigator, "Address1", strAddress1); 7 replaceBookmark(navigator, "Address2", strAddress2); 8 replaceBookmark(navigator, "NoteCode", strNoteCode);
最后保存文件为pdf格式
1 string strGenerateDocx = Path.Combine(disDateMergedFolder, DateTime.Now.ToString("yyyyMMddhhmmssfff_") + strNameAsFile + @"_Note.docx"); 2 document.SaveToFile(strGenerateDocx);
有需要合并pdf的可以参考
1 //合并Physician form模板 2 Pdf pdfDocument = new Pdf(); 3 pdfDocument.MergeFiles(strPdfFile, new string[] { strPdfTempFile, Path.Combine(disTemplateFolder, @"Physician Form.pdf") }); 4 document.Close();
word模板
实际PDF文件效果。