C#实现HTML转WORD及WORD转PDF的方法

时间:2022-01-19 16:34:59

本文实例讲述了C#实现HTML转WORD及WORD转PDF的方法。分享给大家供大家参考。具体如下:

功能:实现HTML转WORD,WORD转PDF

具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Word = Microsoft.Office.Interop.Word;
using oWord = Microsoft.Office.Interop.Word;
using System.Reflection;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.Office.Core;
using System.Text.RegularExpressions;
namespace WindowsApplication2
{
 public partial class Form1 : Form
 {
  public Form1()
  {
   InitializeComponent();
  }
  private void button1_Click(object sender, EventArgs e)
  {
   object oMissing = System.Reflection.Missing.Value;
   object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */
   //Start Word and create a new document.
   Word._Application oWord;
   Word._Document oDoc;
   oWord = new Word.Application();
   oWord.Visible = true;
   oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
    ref oMissing, ref oMissing);
   //Insert a paragraph at the beginning of the document.
   Word.Paragraph oPara1;
   oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);
   oPara1.Range.Text = "Heading 1";
   oPara1.Range.Font.Bold = 1;
   oPara1.Format.SpaceAfter = 24; //24 pt spacing after paragraph.
   oPara1.Range.InsertParagraphAfter();
   //Insert a paragraph at the end of the document.
   Word.Paragraph oPara2;
   object oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
   oPara2 = oDoc.Content.Paragraphs.Add(ref oRng);
   oPara2.Range.Text = "Heading 2";
   oPara2.Format.SpaceAfter = 6;
   oPara2.Range.InsertParagraphAfter();
   //Insert another paragraph.
   Word.Paragraph oPara3;
   oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
   oPara3 = oDoc.Content.Paragraphs.Add(ref oRng);
   oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:";
   oPara3.Range.Font.Bold = 0;
   oPara3.Format.SpaceAfter = 24;
   oPara3.Range.InsertParagraphAfter();
   //Insert a 3 x 5 table, fill it with data, and make the first row
   //bold and italic.
   Word.Table oTable;
   Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
   oTable = oDoc.Tables.Add(wrdRng, 3, 5, ref oMissing, ref oMissing);
   oTable.Range.ParagraphFormat.SpaceAfter = 6;
   int r, c;
   string strText;
   for (r = 1; r <= 3; r++)
    for (c = 1; c <= 5; c++)
    {
     strText = "r" + r + "c" + c;
     oTable.Cell(r, c).Range.Text = strText;
    }
   oTable.Rows[1].Range.Font.Bold = 1;
   oTable.Rows[1].Range.Font.Italic = 1;
   //Add some text after the table.
   Word.Paragraph oPara4;
   oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
   oPara4 = oDoc.Content.Paragraphs.Add(ref oRng);
   oPara4.Range.InsertParagraphBefore();
   oPara4.Range.Text = "And here's another table:";
   oPara4.Format.SpaceAfter = 24;
   oPara4.Range.InsertParagraphAfter();
   //Insert a 5 x 2 table, fill it with data, and change the column widths.
   wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
   oTable = oDoc.Tables.Add(wrdRng, 5, 2, ref oMissing, ref oMissing);
   oTable.Range.ParagraphFormat.SpaceAfter = 6;
   for (r = 1; r <= 5; r++)
    for (c = 1; c <= 2; c++)
    {
     strText = "r" + r + "c" + c;
     oTable.Cell(r, c).Range.Text = strText;
    }
   oTable.Columns[1].Width = oWord.InchesToPoints(2); //Change width of columns 1 & 2
   oTable.Columns[2].Width = oWord.InchesToPoints(3);
   //Keep inserting text. When you get to 7 inches from top of the
   //document, insert a hard page break.
   object oPos;
   double dPos = oWord.InchesToPoints(7);
   oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter();
   do
   {
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    wrdRng.ParagraphFormat.SpaceAfter = 6;
    wrdRng.InsertAfter("A line of text");
    wrdRng.InsertParagraphAfter();
    oPos = wrdRng.get_Information
        (Word.WdInformation.wdVerticalPositionRelativeToPage);
   }
   while (dPos >= Convert.ToDouble(oPos));
   object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
   object oPageBreak = Word.WdBreakType.wdPageBreak;
   wrdRng.Collapse(ref oCollapseEnd);
   wrdRng.InsertBreak(ref oPageBreak);
   wrdRng.Collapse(ref oCollapseEnd);
   wrdRng.InsertAfter("We're now on page 2. Here's my chart:");
   wrdRng.InsertParagraphAfter();
   //Insert a chart.
   Word.InlineShape oShape;
   object oClassType = "MSGraph.Chart.8";
   wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
   oShape = wrdRng.InlineShapes.AddOLEObject(ref oClassType, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing);
   //Demonstrate use of late bound oChart and oChartApp objects to
   //manipulate the chart object with MSGraph.
   object oChart;
   object oChartApp;
   oChart = oShape.OLEFormat.Object;
   oChartApp = oChart.GetType().InvokeMember("Application",
    BindingFlags.GetProperty, null, oChart, null);
   //Change the chart type to Line.
   object[] Parameters = new Object[1];
   Parameters[0] = 4; //xlLine = 4
   oChart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty,
    null, oChart, Parameters);
   //Update the chart image and quit MSGraph.
   oChartApp.GetType().InvokeMember("Update",
    BindingFlags.InvokeMethod, null, oChartApp, null);
   oChartApp.GetType().InvokeMember("Quit",
    BindingFlags.InvokeMethod, null, oChartApp, null);
   //... If desired, you can proceed from here using the Microsoft Graph
   //Object model on the oChart and oChartApp objects to make additional
   //changes to the chart.
   //Set the width of the chart.
   oShape.Width = oWord.InchesToPoints(6.25f);
   oShape.Height = oWord.InchesToPoints(3.57f);
   //Add text after the chart.
   wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
   wrdRng.InsertParagraphAfter();
   wrdRng.InsertAfter("THE END.");
   //Close this form.
   this.Close();
  }
  private void button2_Click(object sender, EventArgs e)
  {
   string s = "";
   if (openFileDialog1.ShowDialog() == DialogResult.OK)
   {
    s = openFileDialog1.FileName;
   }
   else
   {
    return;
   }
   // 在此处放置用户代码以初始化页面
   Word.ApplicationClass word = new Word.ApplicationClass();
   Type wordType = word.GetType();
   Word.Documents docs = word.Documents;
   // 打开文件
   Type docsType = docs.GetType();
   object fileName = s;
   Word.Document doc = (Word.Document)docsType.InvokeMember("Open",
   System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { fileName, false, false });
   // 转换格式,另存为
   Type docType = doc.GetType();
   object saveFileName = "d:\\Reports\\aaa.doc";
   //下面是Microsoft Word 9 Object Library的写法,如果是10,可能写成:
   /*
   docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod,
    null, doc, new object[]{saveFileName, Word.WdSaveFormat.wdFormatFilteredHTML});
   */
   ///其它格式:
   ///wdFormatHTML
   ///wdFormatDocument
   ///wdFormatDOSText
   ///wdFormatDOSTextLineBreaks
   ///wdFormatEncodedText
   ///wdFormatRTF
   ///wdFormatTemplate
   ///wdFormatText
   ///wdFormatTextLineBreaks
   ///wdFormatUnicodeText
   docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod,
    null, doc, new object[] { saveFileName, Word.WdSaveFormat.wdFormatDocument });
   // 退出 Word
   wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod,
    null, word, null);
  }
  private void WordConvert(string s)
  {
   oWord.ApplicationClass word = new Microsoft.Office.Interop.Word.ApplicationClass();
   Type wordType = word.GetType();
   //打开WORD文档
   /*对应脚本中的
    var word = new ActiveXObject("Word.Application");
    var doc = word.Documents.Open(docfile);
   */
   oWord.Documents docs = word.Documents;
   Type docsType = docs.GetType();
   object objDocName =s;
   oWord.Document doc = (oWord.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { objDocName, true, true });
   //打印输出到指定文件
   //你可以使用 doc.PrintOut();方法,次方法调用中的参数设置较繁琐,建议使用 Type.InvokeMember 来调用时可以不用将PrintOut的参数设置全,只设置4个主要参数
   Type docType = doc.GetType();
   object printFileName = @"c:\aaa.ps";
   docType.InvokeMember("PrintOut", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { false, false, oWord.WdPrintOutRange.wdPrintAllDocument, printFileName });
   //new object[]{false,false,oWord.WdPrintOutRange.wdPrintAllDocument,printFileName}
   //对应脚本中的word.PrintOut(false, false, 0, psfile);的参数
   //退出WORD
   //对应脚本中的word.Quit();
   wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null);
   object o1 = "c:\\aaa.ps";
   object o2 = "c:\\aaa.pdf";
   object o3 = "";
   //引用将PS转换成PDF的对象
   //try catch之间对应的是脚本中的 PDF.FileToPDF(psfile,pdffile,"");  //你可以使用 pdfConvert.FileToPDF("c:\\test.ps","c:\\test.pdf","");这样的转换方法,本人只是为了保持与WORD相同的调用方式
   try
   {
    ACRODISTXLib.PdfDistillerClass pdf = new ACRODISTXLib.PdfDistillerClass();
    Type pdfType = pdf.GetType();
    pdfType.InvokeMember("FileToPDF", System.Reflection.BindingFlags.InvokeMethod, null, pdf, new object[] { o1, o2, o3 });
    pdf = null;
   }
   catch { } //读者自己补写错误处理
   //为防止本方法调用多次时发生错误,必须停止acrodist.exe进程
   foreach (System.Diagnostics .Process proc in System.Diagnostics.Process.GetProcesses())
   {
    int begpos;
    int endpos;
    string sProcName = proc.ToString();
    begpos = sProcName.IndexOf("(") + 1;
    endpos = sProcName.IndexOf(")");
    sProcName = sProcName.Substring(begpos, endpos - begpos);
    if (sProcName.ToLower().CompareTo("acrodist") == 0)
    {
     try
     {
      proc.Kill(); //停止进程
     }
     catch { } //读者自己补写错误处理
     break;
    }
   }
  }
  private void button3_Click(object sender, EventArgs e)
  {
   if (openFileDialog1.ShowDialog() == DialogResult.OK)
   {
    string s = openFileDialog1.FileName;
    WordConvert(s);
   }
  }
  //getnextcode
  private void button4_Click(object sender, EventArgs e)
  {
   WorkCell myWorkCell = new WorkCell(textBox2.Text,textBox1.Text);
   textBox3.Text = myWorkCell.GetNextCode();
  }
 }
 public class WorkCell
 {
  private string workCellCode;
  private string parentCellCode;
  private string commonCode;
  private char[] code;
  private char[] pCode;
  private char[] standCode;
  private string s;
  public WorkCell( string mycode,string parentcode)
  {
   workCellCode = mycode;
   parentCellCode = parentcode;
   standCode = new char[] { '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'W', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
   commonCode = Regex.Replace(parentCellCode,@"0+","");
   code = workCellCode.Substring(commonCode.Length).ToCharArray();
  }
  public string WorkCellCode
  {
   set
   {
    workCellCode = value;
   }
   get
   {
    return workCellCode;
   }
  }
  public string ParentCellCode
  {
   set
   {
    workCellCode = value;
   }
   get
   {
    return workCellCode;
   }
  }
  public string GetNextCode()
  {
   string s="";
   if (code.Length > 0)
   {
    int i = 0;
    for (i = code.Length - 1; i >= 0; i--)
    {
     if (code[i] != '0')
     {
      GetNextChar(i);
      break;
     }
    }
    for(i=0;i<code.Length;i++)
    {
     s+=code[i].ToString();
    }
    return commonCode + s;
   }
   else
   {
    return "null";
   }
  }
  //设置code中的下一个代码,从右边起,找到第一个非0字符,将其按标准代码自加1,溢出则进位
  private char GetNextChar(int j)
  {
   int i = -1;
   int flag = 0;
   for (i = 0; i < standCode.Length; i++)
   {
    if (code[j] == standCode[i])
    {
     flag = 1;
     break;
    }
   }
   //MessageBox.Show(code[j].ToString()+" "+standCode[i].ToString()+" "+i.ToString());
   if (i >= standCode.Length-1 || flag==0)
   {
    code[j] = standCode[0];
    if (j > 0)
     code[j - 1] = GetNextChar(j - 1);
   }
   else
   {
    code[j] = standCode[i + 1];
   }
   return code[j];
  }
 }
}

希望本文所述对大家的C#程序设计有所帮助。