Problema con "Microsoft print to PDF" se richiamata da codice

di il
0 risposte

Problema con "Microsoft print to PDF" se richiamata da codice

Ciao a tutti,

mi sono imbattuto in questo comportamento curioso. Con questo codice stampo un XPS in PDF

            var printers = new LocalPrintServer().GetPrintQueues();
            var queue = printers.FirstOrDefault(x => x.Name == "Microsoft Print to PDF");
            if (queue != null)
            {
                Clipboard.SetText(nomeFilePdf);
                MessageBox.Show("Nuovo nome file copiato negli appunti");
                queue.AddJob("test", tempFile, false);
                if(File.Exists(nomeFilePdf))
                {
\\eccetera...

Tutto apparentemente funziona bene, non fosse che nel PDF non mi trovo le immagini che invece nel XPS sono perfettamente visibili. Se apro l'XPS così creato e lo stampo scegliendo “Microsoft Print to PDF”, mi ritrovo il PDF corretto. Ha funzionato per un bel po', ma non vorrei che qualche aggiornamento di Win11 abbia modificato qualcosa e non saprei di preciso collocare l'inizio della presenza del problema.

L'XPS contiene il layout di una form WPF che ho la necessità di stampare e non son riuscito a trovare una maniera per farmela rendere direttamente in PDF. Ho utilizzato questo codice

            string tempFile = @"C:\miapath\blablabla\xpsTemp.xps";
            if (File.Exists(tempFile))
                File.Delete(tempFile);
            
            using (XpsDocument xpsDoc = new XpsDocument(tempFile, FileAccess.ReadWrite))
            {
                XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
                VisualsToXpsDocument vToXpsD = (VisualsToXpsDocument)writer.CreateVisualsCollator();
                
                vToXpsD.BeginBatchWrite();    
                for (byte i = 0; i < tab.Items.Count; i++)
                {
                    if (tab.Items[i] is TabItem ti)
                    {
                        tab.SelectedItem = ti;
                        lblPagine.Text = $"Pag. {i+1}";
                        mainGrid.InvalidateVisual();
                        vToXpsD.Write(mainGrid);
                    }
                }
                vToXpsD.EndBatchWrite();
            }

Valuto tranquillamente alternative.

Grazie in anticipo!

Devi accedere o registrarti per scrivere nel forum
0 risposte