C# gestione dei file pdf con pdfsharp per unire file e proteggerli

Articolo che fornisce al lettore alcune funzionalità della libreria gratuita PdfSharp per la gestione dei file pdf.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come utilizzare la libreria PdfSharp per gestire i file di tipo “Pdf”.  in particolar modo vedremo come unire due file pdf in uno solo, proteggerli con Password e togliere la password, il tutto con il linguaggio di programmazione C# e l’ambiente di sviluppo “Visual Studio 2022 Community” con versione del Framework 7.
Il progetto sarà di tipo “Windows Application”, ma il codice si potrà utilizzare anche per progetti di tipo web.


Creazione del progetto


Si crea un nuovo progetto di tipo “App Windows Forms” impostando un nome al progetto di proprio piacimento e nella maschera successiva selezionare la versione del Framework 7.
Una volta terminata la creazione del progetto non resta che aggiungere alla form tre pulsanti, il primo dovrà unire due file pdf in un solo file, importando le varie pagine dei due file pdf, il secondo pulsante permetterà di impostare la password ed il terzo pulsante togliere la password.
Per il primo pulsante, impostiamo la proprietà “Text” con il valore “Concatena file” e la proprietà “Name” impostata su “BtnConcatenaFile”, per il secondo pulsante, per la proprietà “Text” impostare il valore “Protezione” e la proprietà “Name” con il valore “BtnProtezione”. Infine il terzo ed ultimo pulsante impostare la proprietà “Name” con il valore “BtnToglieProtezione” e la proprietà “Text” con il valore “Togli Protezione”, il tutto sarà come mostrato in figura 1.

Figura 1 – La disposizione dei pulsanti per i vari esempi

Figura 1 – La disposizione dei pulsanti per i vari esempi

Dopo aver aggiunti i pulsanti, non resta che aggiungere al progetto il riferimento alla libreria “PdfSharp” come già illustrato in un precedente articolo visibile qui https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_csharp-creazione-di-un-file-pdf-tramite-la-libreri_1822.aspx


Dopo aver aggiunto al nostro progetto il riferimento alla libreria “PdfSharp” la parte di creazione del progetto è terminata.

Stesura del codice


Terminata la predisposizione del progetto con i riferimenti ed i vari pulsanti, non resta che scrivere il codice per i vari pulsanti.
Passiamo in visualizzazione codice, ed in alto sopra ad ogni dichiarazione inseriamo lo spazio dei nomi per la gestione della libreria gratuita “PdfSharp”, di seguito si riporta il frammento di codice delle suddette operazioni.

C#
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using PdfSharp.Pdf.Security;
using System.Reflection.Metadata;
using System.Text;

Ora passiamo in visualizzazione grafica, e facciamo doppio click sul primo pulsante, in modo che passiamo in visualizzazione codice dell’evento click del pulsante.
Nell’evento click si creano tre oggetti di tipo “PdfDocument”, uno sarà l’insieme di tutte le pagine di entrambi i file, e salverà il nuovo file in una determinata cartella, gli altri saranno i file pdf da unire al nuovo file pdf, l’apertura dei file avviene tramite il metodo “Open” passando il riferimento del percorso e nome file e tipologia di apertura (import). Per ogni pagina che troviamo nel file pdf aperto, lo inseriamo nel file nuovo tramite il metodo “AddPage”, infine tramite il metodo “Save” salviamo sul disco il file creato.
Di seguito si riporta il codice dell’evento click del pulsante delle suddette operazioni.

C#
 private void BtnConcatenaFile_Click(object sender, EventArgs e)
       {
           try
           {
               //creazione nuovo file
               PdfDocument NuovoPdf = new PdfDocument();
               PdfDocument documento1 = PdfReader.Open("C:\\Varie\\documento1.pdf", PdfDocumentOpenMode.Import);
               PdfDocument documento2 = PdfReader.Open("C:\\Varie\\documento2.pdf", PdfDocumentOpenMode.Import);
               //Importo le pagine del primo file
               foreach (PdfPage pagina in documento1.Pages)
               {
                   NuovoPdf.AddPage(pagina);
               }
               //importo lep agine del secondo file
               foreach (PdfPage pagina in documento2.Pages)
               {
                   NuovoPdf.AddPage(pagina);
               }
               NuovoPdf.Save("C:\\Varie\\NuovoDocumentoConpiuFile.pdf");
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }
       }

Terminata la stesura del codice, non resta che testarlo per verificare la correttezza dei dati, occorre aggiungere nell’evento di inizializzazione della form, il riferimento encoding, visto che usiamo il Framework 7, di seguito si riporta le suddette operazioni.

C#
public Form1()
       {
           InitializeComponent();
           Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
       }

Ritorniamo in modalità grafica, e facciamo click sul secondo pulsante, quello relativo con il testo “Protezione”, nel fare il doppio click si passerà in modalità codice nell’evento click del pulsante.
In questo evento, dobbiamo aprire un file “Pdf” esistente ed impostare la password, tramite la classe “PdfSecuritySettings” oltre ad impostare le password (per utente normale ed utente superiore) , possiamo abilitare determinate funzionalità per l’utente normale, per esempio disabilitare la possibilità di fare la stampa, il tutto come mostrato in figura 2.

Figura 2 – Il pulsante stampa disabilitato

Figura 2 – Il pulsante stampa disabilitato

Tramite il metodo “Save” salviamo il file con le impostazioni di protezione e lo rendiamo protetto.
Di seguito si riporta il codice dell’evento click del pulsante delle suddette operazioni.

C#
private void BtnProtezione_Click(object sender, EventArgs e)
       {
           try
           {
               //creazione nuovo file
               PdfDocument NuovoPdf = PdfReader.Open("C:\\Varie\\Miofile.pdf");
               PdfSecuritySettings ImpostazioniSicurezza = NuovoPdf.SecuritySettings;
               //Livello di sicurezza
               //Con questa password posso fare solo quello che ho impostato a true, altrimenti non me lo permette
               ImpostazioniSicurezza.UserPassword = "MiaPassword";
               //Con questa password posso fare tutto
               ImpostazioniSicurezza.OwnerPassword = "password";
               //Imposto le restrizioni
               ImpostazioniSicurezza.PermitAccessibilityExtractContent = false;
               ImpostazioniSicurezza.PermitAnnotations = false;
               ImpostazioniSicurezza.PermitAssembleDocument = false;
               ImpostazioniSicurezza.PermitExtractContent = false;
               ImpostazioniSicurezza.PermitFormsFill = false;
               ImpostazioniSicurezza.PermitFullQualityPrint = false;
               ImpostazioniSicurezza.PermitModifyDocument = false;
               ImpostazioniSicurezza.PermitPrint = false;
               NuovoPdf.Save("C:\\Varie\\DocumentoPassword.pdf");
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }
       }

Anche in questo caso, eseguiamo il nostro progetto e facciamo le prove, chi userà la password con il valore “MiaPassword” vedrà alcune funzionalità disabilitate, come il pulsante di stampa, mentre chi entra con la password “password” avrà tutte le funzionalità abilitate.
Ora passiamo in visualizzazione grafica e facciamo doppio click sul pulsante con il testo “Togli protezione”, in modo da passare in visualizzazione codice, nell’evento click del pulsante.
In questo pulsante, andremo a togliere la password, o meglio apriamo il file protetto, e tramite un oggetto di tipo “PdfDocument” che fa riferimento al file pdf aperto con la password, lo salveremo senza password.
Di seguito si riporta il frammento di codice delle suddette operazioni.

C#
private void BtnToglieProtezione_Click(object sender, EventArgs e)
       {
           try
           {
               //creazione nuovo file
               PdfDocument NuovoPdf = PdfReader.Open("C:\\Varie\\DocumentoPassword.pdf", "password");
               NuovoPdf.Save("C:\\Varie\\DocumentoPasswordSenzaPassword.pdf");
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }
       }

Conclusioni


L’articolo ha fornito al lettore alcuni aspetti della gestione dei file pdf, offerti dalla libreria gratuita “PdfSharp”, che semplifica lo sviluppo di applicazioni e che permette al programmatore di utilizzare particolari funzionalità per modificare e creare file pdf in vari ambiti.
La libreria, gratuita anche per uso commerciale, offre diverse funzionalità anche per operazioni avanzate.

Il codice illustrato in questo articolo può essere utilizzato anche per altri scenari, in particolare per l'ambiente web con la tecnologia Asp.Net