Nelle applicazioni tipiche "da ufficio", potrebbe venire comodo per i partecipanti di un meeting, prendere appunti su documenti condivisi da una precedente email come, ad esempio, un file PDF. In casi come questo, quindi, viene utile, oltre a mostrare il PDF nella sua interezza, renderizzare una singola pagina come immagine, così che sia "zoomabile" e così che ci si possa interagile con ink e touch.
Supponendo di aver già a disposizione il PDF ottenuto come StorageFile, possiamo caricarlo in memoria sfruttando la classe PdfDocument, dalla quale possiamo anche estrapolare la pagina che ci interessa renderizzare:
private async Task<BitmapImage> CreateImageFromPdfPageAsync(StorageFile file, int pageNumber) { var document = await PdfDocument.LoadFromFileAsync(file); using var memoryStream = new InMemoryRandomAccessStream(); await document.GetPage((uint)pageNumber).RenderToStreamAsync(memory); // ... }
Una volta ottenuta la pagina come stream, possiamo facilmente recuperare l'array di byte, sfruttando anche a livello di sintassi le ultime novità di C# 8:
using var reader = new DataReader(memoryStream); await reader.LoadAsync((uint)memoryStream.Size); var imageAsBytes = new byte[memoryStream.Size]; reader.ReadBytes(imageAsBytes);
Così facendo abbiamo già un oggetto contenente la nostra immagine che possiamo utilizzare per salvarla, ad esempio, sul disco.
Qualora invece volessimo semplicemente visualizzarla a schermo, potremmo sostituire il metodo precedente con il seguente, che va a caricare lo stream letto dalla classe PdfDocument come Source dell'oggetto di tipo BitmapImage:
var bitmapImage = new BitmapImage(); await bitmapImage.SetSourceAsync(memoryStream);
L'immagine caricata può quindi essere associata ad un controllo Image pre-costruito a livello di XAML.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Configurare lo startup di applicazioni server e client con .NET Aspire
Abilitare automaticamente il force push di un gruppo su Azure DevOps
Integrare un servizio esterno con .NET Aspire
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Gestione dell'annidamento delle regole dei layer in CSS
Introduzione alle Container Queries
Fornire parametri ad un Web component HTML
Creare una libreria CSS universale: Clip-path
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
Utilizzare WhenEach per processare i risultati di una lista di task
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
I più letti di oggi
- Novità nella gestione del modello asincrono in C# 5 e VB 11
- Eseguire query con LINQ to SQL
- Conoscere il rendering Server o WebAssembly a runtime in Blazor
- Gestione file Javascript in Blazor con .NET 9
- Migliorare la velocità delle connessioni ai database
- #vs2017 sarà rilasciato il 07/03, in concomitanza con i suoi 20 anni https://aspit.co/bfn
- #VS2017 Community è già disponibile al download da questa pagina https://aspit.co/bgb
- #VS2017 non ha un'ISO, ma è possibile creare un installer offline seguendo la guida ufficiale: https://aspit.co/bgd
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!