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
Ottimizzazione dei block template in Angular 17
C# 12: Cosa c'è di nuovo e interessante
Disabilitare automaticamente un workflow di GitHub
Elencare le container images installate in un cluster di Kubernetes
Creare moduli CSS in React
Utilizzare Tailwind CSS all'interno di React: primi componenti
Effettuare il binding di date in Blazor
Usare le variabili per personalizzare gli stili CSS
Sviluppare un'interfaccia utente in React con Tailwind CSS e Preline UI
Determinare lo stato di un pod in Kubernetes
Cambiare la chiave di partizionamento di Azure Cosmos DB
Utilizzare un service principal per accedere a Azure Container Registry
I più letti di oggi
- Nuova versione per jQuery e prima alpha per jQuery Mobile
- Paginare i risultati con QuickGrid in Blazor
- Utilizzare il trigger SQL con le Azure Function
- Eliminare una determinata proprietà da un oggetto JavaScript
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Modern web apps with Blazor