Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Generare documenti XPS da codice con VB 2008,WPF e gli assembly VSTO

Già con il rilascio di .NET Framework 3.0, Microsoft ha introdotto un nuovo formato di file, con estensione .Xps, che si propone come standard per la portabilità di documenti, che possono così essere visualizzati su ciascun sistema senza avere l'applicazione che li ha originati (un po' come avviene per i .Pdf).

.NET 3.x offre pieno supporto a questo tipo di documenti, che possono essere creati e manipolati con estrema precisione. Se avete letto il mio nuovo libro su .NET Framework 3.x avrete notato come ampio spazio sia dedicato a questo tipo di documenti e al loro utilizzo in Windows Presentation Foundation. Spesso, però, gestire (soprattutto in scrittura) questo tipo di documenti da codice non è sempre semplice, considerata la possibilità di aggiungere immagini, miniature, firme digitali e quant'altro.

Oggi impariamo a creare un generatore "alternativo" di documenti XPS a partire da documenti di Microsoft Word 2007 (.docx e .doc), con uno sforzo davvero minimo. Tramite codice Visual Basic 2008 e gli assembly dei Visual Studio Tools for Office, saremo in grado di generare questo genere di documenti scrivendo una trentina di righe di codice in tutto. Il presupposto è che sul vostro pc sia installato Word 2007 e il relativo componente aggiuntivo per esportare i documenti in formato XPS.

In primo luogo, create un nuovo progetto WPF in Visual Basic 2008. Aggiungete, quindi, un riferimento ai seguenti assembly:

  • ReachFramework.dll;
  • Microsoft.Office.Interop.Word.dll;
  • Microsoft.Office.Tools.v9.0.dll;
  • Microsoft.Office.Tools.Word.v9.0dll;
  • Microsoft.VisualStudio.Tools.Office.Runtime.v9.0.dll

Come potete intuire, stiamo aggiungendo un riferimento a tutti gli assembly dei Visual Studio Tools for Office per Visual Studio 2008, senza però creare una soluzione VSTO specifica.

Dal lato dello strato di presentazione dell'applicazione dimostrativa, permetteremo la selezione di un documento di Word tramite un pulsante e automaticamente mostreremo il documento esportato nel controllo DocumentViewer di WPF. Il seguente codice XAML realizza l'obiettivo:

<Window x:Class="Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Window1" Height="300" Width="300">

    <Grid>

        <Grid.RowDefinitions>

            <RowDefinition Height="40"/>

            <RowDefinition></RowDefinition>

        </Grid.RowDefinitions>

        <DocumentViewer Grid.Row="1" Name="DocumentViewer1" />

        <Button HorizontalAlignment="Left" Margin="10,10,10,5" Name="Button1" Height="25" Width="150">Seleziona documento</Button>

    </Grid>

</Window>

Fatto questo, si passa al file di code-behind. In primo luogo, aggiungiamo le seguenti direttive Imports:

Imports Microsoft.Office.Interop.Word

Imports Microsoft.Win32

Imports System.Windows.Xps.Packaging

In secondo luogo, scriviamo il metodo per l'esportazione del documento di Word selezionato dall'utente, in formato .Xps. I commenti all'interno del codice dovrebbero aiutarvi:

    Private Function exportAsXps(ByVal fileName As String) As Boolean

 

        Try

            'Avvia un'istanza di Word 2007 (in background)

            'e aggiunge il documento specificato alla collection di documenti

            Dim wordInstance As New Microsoft.Office.Interop.Word.Application

            wordInstance.Documents.Add(fileName)

 

            'Ricava il nome del file di output, sostituendo l'estensione con .Xps

            Dim outputName As String = String.Concat(IO.Path.GetDirectoryName(fileName), "\", IO.Path.GetFileNameWithoutExtension(fileName), ".xps")

 

            'Ottiene l'istanza del documento attivo e lo salva specificando il nome e il formato

            Dim doc As Document = wordInstance.ActiveDocument

            doc.SaveAs(outputName, WdSaveFormat.wdFormatXPS)

 

            'Chiude Word 2007

            wordInstance.Quit()

 

            'Visualizza il documento XPS appena generato

            Dim xpsDoc As New XpsDocument(outputName, IO.FileAccess.Read)

            DocumentViewer1.Document = xpsDoc.GetFixedDocumentSequence

 

            Return True

 

            'TODO: Aggiungere qui l'intercettazione di eccezioni specifiche

        Catch ex As Exception

            MessageBox.Show(ex.ToString, "", MessageBoxButton.OK, MessageBoxImage.Information)

            Return False

        End Try

 

    End Function

Una volta che abbiamo il nostro metodo, utilizzarlo è davvero un gioco da ragazzi. Basterà richiamarlo dal gestore dell'evento Click del pulsante, che si occupa di selezionare il documento Word da convertire:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click

 

        Dim ofd As New OpenFileDialog

 

        'La OpenFileDialog di Win32 può restituire True, False o Nothing

        Dim result As Nullable(Of Boolean)

 

        With ofd

            .Title = "Seleziona un documento di Word"

            .Filter = "Documenti|*.docx;*.doc|Tutti i file|*.*"

 

            result = .ShowDialog

 

            'Se la finestra di dialogo restituisce True avvia l'esportazione

            If result = True Then

 

                Dim exportResult As Boolean = exportAsXps(.FileName)

 

                'TODO: Aggiungere qui eventuale codice di verifica

            End If

 

 

        End With

    End Sub

La seguente figura mostra l'output finale della conversione di un mio documento in formato .docx (quindi Word 2007), rappresentativo di un precedente post:

Con uno sforzo veramente minimo, e senza avere Microsoft Word visibile, siamo in grado di generare documenti .Xps a partire dai nostri documenti Word anche se particolarmente complessi. Come sempre, il codice è sicuramente migliorabile, costituisce, in ogni caso, una buona base di partenza se vi interessa questo tipo di lavoro.

Ovviamente, l'esportazione di documenti non è limitata al solo formato .Xps, ma è possibile verso tutti i formati supportati da Word 2007. Solo che io amo in particolar modo i documenti .Xps, in più è uno dei possibili modi per semplificarne la generazione, in alternativa ai metodi consueti previsti da .NET Framework 3.x.

Alessandro

Print | posted on giovedì 21 febbraio 2008 20:06 | Filed Under [ Visual Basic Windows Presentation Foundation Visual Studio Tools for Office ]

Powered by:
Powered By Subtext Powered By ASP.NET