none
Impression sous WPF (PrintTicket?,PrintQueue?,XpsDocument? etc...) RRS feed

Réponses

  •  

    voila comment j'y suis finalement arriver :

     

     

    Extrait de code

     

    Canvas v = CreateMyCanvas(true);

     

    fixedPage.Children.Add((UIElement)v);

    ((IAddChild)pageCont).AddChild(fixedPage);

     

    fixedDoc.Pages.Add(pageCont);

    documentRef.SetDocument(fixedDoc);

    fixedDocSeq.References.Add(documentRef);

     

    MyDocViewer.Document = fixedDocSeq;

    pDialog.PrintVisual(v, "montesssst");

     

     

    faut qd meme passer de Canvas -> FixedPage -> PageContent -> FixedDocument -> FixedDocumentSequence -> DocumentViewer...

     

    y'at'il une solution plus simple....??

     

    Chaks

    jeudi 22 novembre 2007 18:32

Toutes les réponses

  • Bonjour,

    Pour imprimer un document XPS :

     

    Extrait de code


    LocalPrintServer localPrintServer = new LocalPrintServer();
    PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();

    string jobName = "MyJob";
    string fileName = "C:\MyFile.xps";

    defaultPrintQueue.AddJob(jobName, fileName, false);

     


    Le dernier paramètre de AddJob indique si le document doit être passé tel quel au driver de l'imprimante. Si ce paramètre est à true, l'imprimante doit gérer les XPS en natif.

    Sinon tu peux utiliser PrintDialog et sa methode PrintDocument.

     

    Pour imprimer un objet Visual :


    Extrait de code


    using System.IO.Packaging;
    using System.Windows.Xps.Packaging;
    using System.Windows.Xps;

    Package pckg = Package.Open(@"c:\x.xps", FileMode.Create);
    XpsDocument doc = new XpsDocument(pckg);
    XpsDocumentWriter xpsw = XpsDocument.CreateXpsDocumentWriter(doc);
    xpsw.Write(myVisual);
    xpsDoc.Close();
    pckg.Close();

     

     

    Il faut ensuite imprimer le fichier comme indiqué ci-dessus.

    Il faut aussi ajouter une référence à l'assembly ReachFramework.dll

     

    Sinon voila un lien vers la msdn avec toutes les infos nécessaires : http://msdn2.microsoft.com/en-us/library/ms771525.aspx

     

    Guillaume

    mardi 20 novembre 2007 13:35
  •  

    Un Grand Merci deja pour cette réponse...

     

    Je vais te préciser ce que je veu fair ca va etre plus simple...

    car j'ai trouver comment :

    • Imprimer a partir d'un Fichier XPS
    • Imprimer a partir d'un Canvas que je dessine
    • Afficher un fichier XPS dans un DocumentViewer

    Mais je ne trouve pas comment afficher dans un DocumentViewer (avoir un aperçu)

    mon Canvas pour ensuite l'imprimer.

     

    en gros comment afficher un canvas dans un DocumentViewer ???

     

    Je pense a une Propriété "Content" mais comment ...

     

    encor merci...

     

    Chaks

     

     

    jeudi 22 novembre 2007 16:18
  •  

    voila comment j'y suis finalement arriver :

     

     

    Extrait de code

     

    Canvas v = CreateMyCanvas(true);

     

    fixedPage.Children.Add((UIElement)v);

    ((IAddChild)pageCont).AddChild(fixedPage);

     

    fixedDoc.Pages.Add(pageCont);

    documentRef.SetDocument(fixedDoc);

    fixedDocSeq.References.Add(documentRef);

     

    MyDocViewer.Document = fixedDocSeq;

    pDialog.PrintVisual(v, "montesssst");

     

     

    faut qd meme passer de Canvas -> FixedPage -> PageContent -> FixedDocument -> FixedDocumentSequence -> DocumentViewer...

     

    y'at'il une solution plus simple....??

     

    Chaks

    jeudi 22 novembre 2007 18:32
  • Bonjour,

    Je ne pense pas qu'il y ait de meilleur solution. J'allais vous proposer une solution à base de FlowDocument :

     

    Extrait de code

    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       '>http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       ; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       '>http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml"
       ; Title="Window1" Height="609" Width="644">
        <StackPanel Name="stackPanel1">
            <Canvas Height="150" Name="mainCanvas">
                <Ellipse Canvas.Left="27" Canvas.Top="25" Height="100" Name="ellipse1" Stroke="Black" Width="200" Fill="#7FFF0000" />
                <Rectangle Canvas.Left="324" Canvas.Top="25" Height="100" Name="rectangle1" Stroke="Black" Width="200" Fill="Lime" StrokeThickness="5" />
            </Canvas>
            <FlowDocumentPageViewer Name="viewer" Height="419" >
                <FlowDocument>
                    <BlockUIContainer>
                        <Border Height="100">
                            <Border.Background>
                                <VisualBrush Visual="{Binding ElementName=mainCanvas}" />
                            </Border.Background>
                        </Border>
                    </BlockUIContainer>
                </FlowDocument>
            </FlowDocumentPageViewer>
        </StackPanel>
    </Window>

     

    Le canvas pouvant être directement fils de l'élément BlockUIContainer. Il y a 2 étapes de moins (Canvas -> BlockUIContainer -> FlowDocument -> FlowDocumentPageViewer) par contre.

     

    Guillaume

    jeudi 22 novembre 2007 19:47
  • Hello !

    Lorsque tu fais appel à AddJob, cela sous-entend que le fichier existe déjà ?

    Est-il possible de définir la destination du fichier que l'on veut imprimer alors que le fichier n'existe pas encore ?

    Voici mon code :

    SWC.PrintDialog l_PrintDialog = new SWC.PrintDialog();

              

                LocalPrintServer l_LocalPS = new LocalPrintServer();

                PrintQueue l_PrintQueue = l_LocalPS.GetPrintQueue("Microsoft XPS Document Writer");
                l_PrintDialog.PrintQueue = l_PrintQueue;
               
               
                    ReportsPaginator l_Paginator = new ReportsPaginator();

                    l_Paginator.PageSize = new System.Windows.Size(l_PrintDialog.PrintableAreaWidth, l_PrintDialog.PrintableAreaHeight);
                    l_PrintDialog.PrintDocument(l_Paginator, "Print Dancing Zone Report");
                }


    Je n'arrive pas à éviter l'ouverture de la dialog box pour définir la destination du fichier, peux-tu m'aider ?

    Merci d'avance

    Stéphanie


    jeudi 17 janvier 2008 09:45
  • Bonjour,

    Si vous utilisez le drivers d'impression "Microsoft XPS Document Writer", vous ne pourrez pas éviter la dialog box pour définir le fichier de destination car ce mécanisme est intégrée au drivers d'impression.

    Par contre si vous voulez générer un fichier XPS vous pouvez le faire en code directement en utilisant l'objet XpsDocumentWriter :

     

    Extrait de code

    using System.IO.Packaging;
    using System.Windows.Xps.Packaging;
    using System.Windows.Xps;

     


     

    // création du fichier XPS

    string fileName = @"c:\MonFichierDeDestination.xps";

    Package pckg = Package.Open(fileName, FileMode.Create);
    XpsDocument doc = new XpsDocument(pckg);

     

    // création d'un PrintDialog uniquement pour récupérer la taille de la zone d'impression.

    PrintDialog pd = new PrintDialog();

    pd.PrintQueue = (new LocalPrintServer()).GetPrintQueue("Microsoft XPS Document Writer");

     

    ReportsPaginator l_Paginator = new ReportsPaginator();

    l_Paginator.PageSize = new System.Windows.Size(pd.PrintableAreaWidth, pd.PrintableAreaHeight);

     

    // écriture du contenu dans le fichier

    XpsDocumentWriter xpsw = XpsDocument.CreateXpsDocumentWriter(doc);
    xpsw.Write(l_Paginator);

     

    // fermeture
    xpsDoc.Close();
    pckg.Close();

     

     

    Guillaume
    jeudi 17 janvier 2008 11:46
  • Bonjour,

    Merci bcp pour votre réponse.

    Mon but est de pouvoir générer un document PDF! Existe-t-il un moyen de générer un PDF depuis un writer WPF ?

    Merci d'avance pour votre réponse.

    Salutations

    Stéphanie
    jeudi 17 janvier 2008 13:23
  • Bonjour,

    Je ne connais pas de moyen de générer un document PDF à partir de WPF.

    Je ne pense pas qu'il y ait des librairies standard pour faire ça. Peut-être des librairies commercials.

     

    Guillaume

    jeudi 17 janvier 2008 14:06

  • bonjour,

    Beh, c'est vrai (selon ce que je sais)  WPF ne donne pas une méthode directe pour imprimer des fichier PDF, mais c'est possible de le faire comme même en utilisant le PrintDialog : par exemple moi j'ai installé PDFCreator sur mon PC, pour l'utiliser je procède à une impression, et je choisi PDFCreator dans la liste des imprimantes dans le dialog d'impression, ainsi c'est possible de faire la même chose avec WPF en utilisant PrintDialog qui vous affichera le dialog permettant de choisir l'imprimante à utilisée.

    Salutations

    Assem.


    mardi 29 janvier 2008 10:55

  • tu peux même, ne pas attendre à afficher le PrintDialog, il suffit de lui associer le PrintQueue exacte :

    PrintDialog pd = new PrintDialog();
    PrintQueue pq = new PrintQueue(new PrintServer(), "PDFCreator");
    pd.PrintQueue = pq;
    pd.PrintVisual(image, Path.GetFileName(filename) + " from Gallery");

    ou de faire :

    PrintQueue pq = new PrintQueue(new PrintServer(), "PDFCreator");
    XpsDocumentWriter xpsDW = PrintQueue.CreateXpsDocumentWriter(pq);
    xpsDW.Write(image);
    mardi 29 janvier 2008 11:27