Public Sub New() If Not CreateWordApp() Then Throw New ApplicationException("Assembly di interoperabilita' con Office non trovato!") End If End Sub Private _wordApp As Word.ApplicationClass Protected Function CreateWordApp() As Boolean Dim retval = True Try _wordApp = New Word.ApplicationClass() _wordApp.Visible = False Catch ex As System.Exception _wordApp = Nothing retval = False End Try Return retval End Function La conversione del file doc sara' effettuata aprendo il file stesso ed eseguendo un’operazione di SaveAs: Private Function OpenDocument(ByVal oFileName As Object) As Word.Document Dim missing As Object = System.Reflection.Missing.Value Dim aDoc As Word.Document = Nothing Try aDoc = _wordApp.Documents.Open(oFileName, missing, False, _ missing, missing, missing, _ missing, missing, missing, _ missing, missing, False) Catch ex As System.Exception aDoc = Nothing End Try Return aDoc End Function Private Function SaveDocumentAs(ByVal document As Word.Document, _ ByRef filename As String, _ ByVal wdSaveFormat As Integer) As DocConverterResult Dim retval As DocConverterResult = DocConverterResult.OK Try document.SaveAs(CType(filename, Object), CType(wdSaveFormat, Object)) Catch ex As System.Exception retval = DocConverterResult.DestinationFileNotCreate Finally document.Close() End Try If Not File.Exists(filename.ToString()) Then retval = DocConverterResult.DestinationFileNotCreate filename = "" End If Return retval End Function A questo punto, implementata la funzionalita' di SaveAs, ci basta implementare i due metodi richiamabili dall’esterno per la conversione: Public Function ConvertToRTF(ByVal fileName As String, _ ByRef rtfFileName As String, _ Optional ByVal destinationPath As String = "") As DocConverterResult Dim retval As DocConverterResult = DocConverterResult.OK If _wordApp IsNot Nothing Then Dim oFileName As Object = fileName Dim aDoc As Word.Document = OpenDocument(oFileName) If aDoc IsNot Nothing Then If Not String.IsNullOrEmpty(destinationPath) Then Dim finfo = New FileInfo(fileName) rtfFileName = Path.Combine(destinationPath, finfo.Name.ToLower().Replace(".doc", ".rtf")) Else rtfFileName = fileName.ToLower().Replace(".doc", ".rtf") End If retval = SaveDocumentAs(aDoc, rtfFileName, Word.WdSaveFormat.wdFormatRTF) End If Else retval = DocConverterResult.OfficeComponentNotFound End If Return retval End Function Public Function ConvertToPDF(ByVal fileName As String, _ ByRef pdfFileName As String, _ Optional ByVal destinationPath As String = "") As DocConverterResult Dim retval As DocConverterResult = DocConverterResult.OK If _wordApp IsNot Nothing Then Dim oFileName As Object = fileName Dim aDoc As Word.Document = OpenDocument(oFileName) If aDoc IsNot Nothing Then If Not String.IsNullOrEmpty(destinationPath) Then Dim finfo = New FileInfo(fileName) pdfFileName = Path.Combine(destinationPath, finfo.Name.ToLower().Replace(".doc", ".pdf")) Else pdfFileName = fileName.ToLower().Replace(".doc", ".pdf") End If retval = SaveDocumentAs(aDoc, pdfFileName, wdFormatPDF) End If Else retval = DocConverterResult.OfficeComponentNotFound End If Return retval End Function La classe DocConverter, infine, implementa l’interfaccia IDisposable in modo da poter, nell’evento Dispose(), rilasciare in maniera corretta l’applicazione Word (che compare all’interno del task manager durante lo scope di esecuzione dell’istanza della classe). Per poter utilizzare l’oggetto Word.ApplicationClass e' necessario referenziare la dll Microsoft.Office.Interop.Word.dll (un’istalllazione di Word contiene tale dll) mentre per abilitare il salvataggio in PDF e' necessario scaricare il plug-in per office scaricabile dall’indirizzo: <http://www.microsoft.com/downloads/details.aspx?FamilyID=f1fc413c-6d89-4f15-991b-e'b07ba5f2e5&DisplayLang=en> |