Pergunta

Estou tentando modificar o objeto System.Drawing.Printing.PrinterSettings que recebo de System.Windows.Forms.PrintDialog depois que a caixa de diálogo foi mostrada ao usuário.Embora eu possa alterar os valores das propriedades no objeto PrinterSettings, nenhuma das alterações que faço após a exibição da caixa de diálogo é realmente considerada ao imprimir um documento.

Aqui está um exemplo do que quero dizer:

//Show the printdialog and retreive the printersettings    
var printDialog = new PrintDialog();
if (printDialog.ShowDialog() != DialogResult.OK) 
            return;
var printerSettings = printDialog.PrinterSettings;

//Now modify the printersettings object
printerSettings.ToPage = 8;

Agora use o objeto PrinterSettings para impressão.Eu uso a dll Aspose.Words de terceiros para isso, pois preciso imprimir o Word, mas esse parece não ser o problema.Parece que depois que a caixa de diálogo foi exibida, todas as configurações já foram confirmadas na impressora e a alteração das configurações da impressora não resulta em nada.Alguma idéia de como fazer isso funcionar?

EDITAR:Eu tenho algumas soluções alternativas para isso.O que quero aqui é obter uma resposta a estas perguntas específicas:É possível alterar o objeto PrinterSettings após a exibição da caixa de diálogo e essas alterações são consideradas na impressão.Se alguém souber apenas uma maneira de como isso pode funcionar (você pode decidir qual API deseja usar para impressão, não importa, desde que o objeto PrinterSettings seja usado), eu ficaria muito grato.

Foi útil?

Solução

Não sei por que sua pergunta foi rejeitada, parece bastante razoável para mim ????

De qualquer forma, notei algumas coisas com PrintDialog (que podem ou não responder à sua pergunta).

A primeira coisa é que é apenas uma classe wrapper para o diálogo do Windows com.

[DllImport("comdlg32.dll", CharSet=CharSet.Auto, SetLastError=true)]
        public static extern bool PrintDlg([In, Out] NativeMethods.PRINTDLG lppd);

e em segundo lugar, e mais importante com referência à sua pergunta, eu acho:A classe PrintDialog possui esta rotina que é chamada após o fechamento da chamada PrintDlg

if (!UnsafeNativeMethods.PrintDlg(data))
                return false;

            IntSecurity.AllPrintingAndUnmanagedCode.Assert();
            try { 
                UpdatePrinterSettings(data.hDevMode, data.hDevNames, data.nCopies, data.Flags, settings, PageSettings); 
            }
            finally { 
                CodeAccessPermission.RevertAssert();
            }

. . .

// VSWhidbey 93449: Due to the nature of PRINTDLGEX vs PRINTDLG, separate but similar methods 
// are required for updating the settings from the structure utilized by the dialog.
// Take information from print dialog and put in PrinterSettings
private static void UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, short copies, int flags, PrinterSettings settings, PageSettings pageSettings) {
        // Mode 
        settings.SetHdevmode(hDevMode);
        settings.SetHdevnames(hDevNames); 

        if (pageSettings!= null)
            pageSettings.SetHdevmode(hDevMode); 

        //Check for Copies == 1 since we might get the Right number of Copies from hdevMode.dmCopies...
        //this is Native PrintDialogs
        if (settings.Copies == 1) 
            settings.Copies = copies;

        settings.PrintRange = (PrintRange) (flags & printRangeMask); 
    }

Há também uma interação bastante interessante aqui (tendo em mente que você configurou PrinterSettings.ToPage):

public PrinterSettings PrinterSettings {
   get { 
        if (settings == null)
        {
            settings = new PrinterSettings(); 
        }
        return settings; 
    } 
    set {
        if (value != PrinterSettings) 
        {
            settings = value;
            **printDocument = null;**
        } 
    }
} 

e então

public PrintDocument Document {
            get { return printDocument;}
            set {
                printDocument = value; 
                **if (printDocument == null)
                    settings = new PrinterSettings();** 
                else 
                    settings = printDocument.PrinterSettings;
            } 
        }

Não é uma resposta direta, eu sei, mas acho que deveria apontar a direção certa sobre por que não está funcionando.Parece-me que durante o uso do diálogo, ele pode anular as configurações nas alterações, pois será recriado após a conclusão, mas quando o Diálogo for concluído, a alteração das configurações invalidará as configurações de impressão do documento até que seja definido novamente.Pode ser possível fazer isso manualmente, ou pode ser bloqueado por M$ da maneira interna/privada usual que muitos internos fazem.

É claro que existe uma opção (não tão boa que eu sei) de apenas usar a API do Win diretamente após a chamada - o código pode ser extraído dos diálogos acima para construir seu próprio wrapper, se necessário.

Boa sorte.

Outras dicas

Da documentação do Aspose:

AsposeWordsPrintDocument awPrintDoc = new AsposeWordsPrintDocument(doc);
awPrintDoc.PrinterSettings = printDlg.PrinterSettings;

Portanto, parece que você pode passar seu objeto PrinterSettings modificado para o documento do Word que está tentando imprimir.Você poderia me dizer se isso funciona?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top