如何基於DevExpress實現對PDF等文檔預覽及操作處理

DevExpress擁有.NET開發需要的所有平臺控件,包含600多個UI控件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用於 Visual Studio的CodeRush等一系列輔助工具。

在一般的管理系統模塊裏面,越來越多的設計到一些常用文檔的上傳保存操作,其中如PDF、Word、Excel等文檔,有時候是通過分佈式的WCF技術實現數據的顯示和處理,因此希望直接預覽而不需要下載文件,這樣能夠給我們提供很多的方便。在DevExpress裏面,提供了相應的控件來顯示和處理這些文檔,本文主要介紹如何利用DevExpress的控件實現對PDF、Word、Excel文檔的預覽和操作處理。

一、PDF的預覽和操作

在較早的DevExpress的控件裏面,已經提供了對應的PDF文檔的顯示控件,不過由於其對PDF格式支持不是很好,有些文檔是Office導出的,也不是很正常閱讀,因此很少使用,本文介紹的DevExpress的PDF查看控件是基於14.1的,測試過很多文檔,好像都能正常打開,因此也想在系統中廣泛使用了。

爲了演示這些控件的處理,我單獨編寫了一個例子,用來實現對PDF、Word、Excel等文檔的處理。

WinForm界面開發教程

爲了顯示PDF文檔,我們需要在界面裏面添加一個XtraPdfViewer.PdfViewer的控件,這個主要是用來顯示PDF的,它有很多屬性方法,用來實現對PDF的處理操作,測試界面設計好如下所示。

WinForm界面開發教程

對PDF,我們一般主要是用來打開文件,另存爲,或者預覽就可以了。相關的操作代碼如下所示。

 

/// <summary>
/// PDF測試顯示窗體
/// </summary>
public partial class PDFViewer : Form
{
//記錄窗體的名稱
readonly string mainFormText;

public PDFViewer()
{
InitializeComponent();

//記錄窗體的名稱,並實現文檔變化事件的處理,方便顯示新的文件名稱
mainFormText = this.Text;
pdfViewer1.DocumentChanged += new DevExpress.XtraPdfViewer.PdfDocumentChangedEventHandler(pdfViewer1_DocumentChanged);
}

/// <summary>
/// PDF文檔變化後,實現對新文件名稱的顯示
/// </summary>
void pdfViewer1_DocumentChanged(object sender, DevExpress.XtraPdfViewer.PdfDocumentChangedEventArgs e)
{
string fileName = Path.GetFileName(e.DocumentFilePath);
if (String.IsNullOrEmpty(fileName))
{
Text = mainFormText;
}
else
{
Text = fileName + " - " + mainFormText;
}
}

/// <summary>
/// 打開PDF文件
/// </summary>
private void btnOpenFile_Click(object sender, EventArgs e)
{
string filePath = FileDialogHelper.OpenPdf();
if (!string.IsNullOrEmpty(filePath))
{
this.pdfViewer1.LoadDocument(filePath);
}
}

/// <summary>
/// 另存爲PDF文件
/// </summary>
private void btnSaveAs_Click(object sender, EventArgs e)
{
string dir = System.Environment.CurrentDirectory;
string filePath = FileDialogHelper.SavePdf("", dir);
if (!string.IsNullOrEmpty(filePath))
{
try
{
this.pdfViewer1.SaveDocument(filePath);
MessageUtil.ShowTips("保存成功");
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
MessageUtil.ShowError(ex.Message);
}
}
}

/// <summary>
/// PDF文件打印
/// </summary>
private void btnPreview_Click(object sender, EventArgs e)
{
this.pdfViewer1.Print();
}
}

 

從上面的代碼,我們可以看到,對於PDF,我們操作起來很方便,主要就是在界面裏面加載文件後,就可以對PDFViewer對象實現相關的操作了。

二、WORD文檔的預覽和操作

類似於PDF文檔,我們對WORD文檔,也是通過使用RichEditControl實現文檔的顯示,不過和PDFViewer不同,這個控件可以實現對文檔的修改和保存操作,這種對於我們提供用戶對文檔進行編輯很方便。

測試例子的界面如下所示。

WinForm界面開發教程

相關的操作代碼,也和PDF的操作類似,不同的是,它在文檔變化後,不能很容易從參數裏面獲取到對應的文檔的路徑,需要特殊的處理才能得到。

 

/// <summary>
/// WORD控件的測試例子
/// </summary>
public partial class WordViewer : Form
{
//記錄窗體的名稱
readonly string mainFormText;

public WordViewer()
{
InitializeComponent();

//記錄窗體的名稱,並實現文檔變化事件的處理,方便顯示新的文件名稱
mainFormText = this.Text;
this.richEditControl1.DocumentLoaded += new EventHandler(richEditControl1_DocumentLoaded);
}

/// <summary>
/// WORD文檔變化後,實現對新文件名稱的顯示
/// </summary>
void richEditControl1_DocumentLoaded(object sender, EventArgs e)
{
string fileName = Path.GetFileName(this.richEditControl1.Options.DocumentSaveOptions.CurrentFileName);
if (String.IsNullOrEmpty(fileName))
{
Text = mainFormText;
}
else
{
Text = fileName + " - " + mainFormText;
}

//修改默認字體
DocumentRange range = richEditControl1.Document.Range;
CharacterProperties cp = this.richEditControl1.Document.BeginUpdateCharacters(range);
cp.FontName = "新宋體";
//cp.FontSize = 12;
this.richEditControl1.Document.EndUpdateCharacters(cp);
}

/// <summary>
/// 打開WORD文件
/// </summary>
private void btnOpenFile_Click(object sender, EventArgs e)
{
string filePath = FileDialogHelper.OpenWord();
if (!string.IsNullOrEmpty(filePath))
{
richEditControl1.LoadDocument(filePath);//, DocumentFormat.Doc);
}
}

/// <summary>
/// 保存WORD文件
/// </summary>
private void btnSaveFile_Click(object sender, EventArgs e)
{
this.richEditControl1.SaveDocument();
}

/// <summary>
/// 另存爲WORD文件
/// </summary>
private void btnSaveAs_Click(object sender, EventArgs e)
{
try
{
richEditControl1.SaveDocumentAs();
MessageUtil.ShowTips("保存成功");
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
MessageUtil.ShowError(ex.Message);
}
}

/// <summary>
/// WORD文件打印
/// </summary>
private void btnPreview_Click(object sender, EventArgs e)
{
this.richEditControl1.ShowPrintPreview();
}
}

 

加載文檔後,界面顯示內容如下所示:

WinForm界面開發教程

文檔控件很容易支持打印預覽功能,打印預覽的界面如下所示

WinForm界面開發教程

不過話說回來,這個RichEditControl雖然能夠較好顯示Word文檔,不過也有一些字體顯示的不是很好,格式和微軟的Word軟件顯示的有些不太一樣,格式有所損失。

因此如果對於格式要求比較嚴謹的,建議還是隻是做顯示爲佳,不要保存原有的文檔。如果對格式不是特別嚴格,倒是可以作爲一個文檔服務器實現文檔的新建、保存處理。

三、Excel文檔的預覽和操作

對於Excel文檔的預覽和操作,DevExpress控件在最近版本中增加的XtraSpreadsheet.SpreadsheetControl控件就可以實現Excel的顯示和處理操作,這個控件很強大,可以處理很複雜格式的Excel文檔,雖然我原來使用了另外一個FarPoint Spread控件組,不過這個XtraSpreadsheet控件組,如果集成在DevExpress也就很方便了。

WinForm界面開發教程

這個DevExpress的控件,可以在其中進行Excel的新建、保存、打印預覽等操作,當然也可以打開我們已有的Excel文件了。

打開文件後,界面效果如下所示。

WinForm界面開發教程

界面的相關功能操作代碼如下所示。

 

/// <summary>
/// Excel控件的測試例子
/// </summary>
public partial class ExcelViewer : Form
{
//記錄窗體的名稱
readonly string mainFormText;

public ExcelViewer()
{
InitializeComponent();

//記錄窗體的名稱,並實現文檔變化事件的處理,方便顯示新的文件名稱
mainFormText = this.Text;
this.spreadsheetControl1.DocumentLoaded += new EventHandler(spreadsheetControl1_DocumentLoaded);
}

/// <summary>
/// 文檔變化後,實現對新文件名稱的顯示
/// </summary>
void spreadsheetControl1_DocumentLoaded(object sender, EventArgs e)
{
string fileName = Path.GetFileName(this.spreadsheetControl1.Document.Path);
if (String.IsNullOrEmpty(fileName))
{
Text = mainFormText;
}
else
{
Text = fileName + " - " + mainFormText;
}
}

/// <summary>
/// 打開Excel文件
/// </summary>
private void btnOpenFile_Click(object sender, EventArgs e)
{ 
string filePath = FileDialogHelper.OpenExcel();
if (!string.IsNullOrEmpty(filePath))
{
IWorkbook workbook = spreadsheetControl1.Document;
workbook.LoadDocument(filePath);
}
}

/// <summary>
/// 保存Excel文件
/// </summary>
private void btnSaveFile_Click(object sender, EventArgs e)
{
spreadsheetControl1.SaveDocument();
}

/// <summary>
/// 另存爲Excel文件
/// </summary>
private void btnSaveAs_Click(object sender, EventArgs e)
{
string dir = System.Environment.CurrentDirectory;
string filePath = FileDialogHelper.SaveExcel("", dir);
if (!string.IsNullOrEmpty(filePath))
{
try
{
IWorkbook workbook = spreadsheetControl1.Document;
workbook.SaveDocument(filePath);

MessageUtil.ShowTips("保存成功");
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
MessageUtil.ShowError(ex.Message);
}
}
}

/// <summary>
/// Excel文件打印
/// </summary>
private void btnPreview_Click(object sender, EventArgs e)
{
this.spreadsheetControl1.ShowPrintPreview();
}
}

 

預覽也很方便,和Word的預覽操作類似。

WinForm界面開發教程

以上就是幾個常用文檔的顯示和操作案例,有了這些我們很容易整合到我們的附件管理裏面了。

如我在我的《Winform開發框架》、《混合式開發框架裏面》使用的通用附件管理模塊,就是基於這些特點,實現圖片、Excel文檔、Word文檔和PDF等文檔的在線預覽和管理操作,界面截圖如下所示。

WinForm界面開發教程

本文轉載自博客園-伍華聰


上DevExpress中文網,獲取第一手最新產品資訊!

DevExpress技術交流羣3:700924826      歡迎一起進羣討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章