2015-12-14 1 views
1

Je développe un programme wpf C# qui gère une école. De temps en temps, l'utilisateur doit imprimer des certifications pour un seul étudiant. Par exemple une certification que cet étudiant apprend dans notre institution, ou une certification avec le montant de son allocation.Quelle est l'option la plus rapide pour imprimer un rapport d'une seule page (programme wpf C#)

Sur ces rapports il y a:

  1. texte fixe
  2. des informations dynamiques sur l'étudiant comme son nom et ainsi de suite

Pour cette tâche, je construit RDL et il sert l'objectif, mais les utilisateurs ont demandé une vitesse plus rapide.

Ma question est: est-ce que rdls (travaillant sur un serveur de rapports) est la bonne méthode pour cette tâche? ou existe-t-il une autre option plus rapide?

Répondre

1

J'utilise un FlowDocument pour une fonctionnalité d'impression simple comme celle-ci. Vous ajoutez des éléments XAML au document tout comme vous le feriez lors de la création de XAML dans une fenêtre par programmation. Utilisez les mêmes contrôles de disposition (grilles, panneaux de pile, etc.) pour organiser tous les autres contrôles (paragraphes de texte, images, etc.), et lorsque le FlowDocument est imprimé, il sera "coulé" dans la page en fonction de divers facteurs comme le format de papier sélectionné dans la boîte de dialogue de l'imprimante.

Clause de non-responsabilité: ceci a été copié/collé à la hâte mais cela devrait vous donner une idée de son fonctionnement!

// Show the print dialog 
var dlg = new PrintDialog(); 
if (!dlg.ShowDialog().GetValueOrDefault()) 
{ 
    // User cancelled 
    return; 
} 

// Create and initialise the FlowDocument 
_doc = new FlowDocument(); 
_doc.FontFamily = new FontFamily("Arial"); 
_doc.FontSize = 14; 

// Add a paragraph of text 
var para = new Paragraph(new Run("My paragraph.....")) 
{ 
    FontSize = 14, 
    Foreground = new SolidColorBrush(Colors.Black), 
    Margin = new Thickness(0,0,0,12) 
}; 
_doc.Blocks.Add(para); 

// Add an image 
var para = new Paragraph(); 
var img = new Image 
{ 
    Source = bitmapSource, 
    HorizontalAlignment = HorizontalAlignment.Center, 
    Margin = new Thickness(0,0,0,12) 
}; 
para.Inlines.Add(img); 
_doc.Blocks.Add(para); 

// Print 
var documentPaginator = ((IDocumentPaginatorSource)_doc).DocumentPaginator; 
dlg.PrintDocument(documentPaginator, "My print job"); 

Dans mon application, j'ai tout cela enveloppé dans une classe (car j'ai quelques endroits où j'ai besoin d'une fonctionnalité d'impression). La classe crée et initialise le FlowDocument dans son constructeur, et fournit diverses méthodes telles que "AddParagraph()", "AddImage()", avec différentes surcharges pour spécifier les marges, les polices, les tailles de police, etc

Le document paginator Un peu à la fin est une version simplifiée de ma mise en œuvre, mais cela peut suffire à vos besoins. (J'ai créé un paginateur de document personnalisé qui permet de définir un en-tête et un pied de page sur chaque page).

+0

Merci beaucoup. Je commence par cette méthode, en essayant de construire un papier imprimé. Je suis sûr que je vais devoir vérifier cette méthode pour savoir si elle permettra l'impression instantanée sans prévisualisation, l'exportation vers html ou docx, et ainsi de suite. –