2009-07-29 7 views
0

Notre société développe une application (WPF, destinée à .NET 3.5) avec les composants de diagramme WPF de MindFusion. Apparemment, l'impression et la sauvegarde de documents XPS entraînent diverses erreurs sur différents systèmes.Problèmes avec XPSDocumentWriter et PrintDialog.PrintDocument

J'ai réduit le problème à un seul échantillon XPS Document créé à partir de notre application. Je vais d'abord donner un aperçu des systèmes concernés et résoudre les problèmes lors de l'enregistrement respectif d'un document xps et de l'impression du diagramme Chemin d'accès dans la liste suivante:

Remarque: Les trois systèmes ont Windows XP SP3 avec .NET 3.5 Framework SP1 installé.

Utilisation du XpsDocumentWriter pour écrire un document XPS avec le Paginator:

PC 1 - Le XPS Viewer (en collaboration avec IE 7.0) ne fonctionne pas (même après réinstallation de .Net 3.5) . XPS Viewer du pack Essential ouvre le document, mais la vue est complètement floue. Mais comme vous pouvez le voir, notre application sur le côté droit du screenshot utilise un DocumentViewer pour tester ce problème, qui fonctionne correctement. L'impression depuis le XPS Viewer corrompu donne la même sortie que sur l'écran, tandis que l'impression à partir de la fonction d'impression intégrée dans DocumentViewer (sans intervention de notre application) donne une sortie floue qui est un peu plus lisible mais pas acceptable.

PC 2 - La visionneuse IE XPS fonctionne correctement. La sortie d'impression est incohérente. Parfois, les graphiques (formes) ne sont pas complets, ou le périphérique d'impression signale le manque de mémoire (avec le même document).

PC 3 - La visionneuse IE XPS fonctionne correctement, mais l'initialisation d'un travail d'impression entraîne toujours exception dans IE lui-même. Note: Tous les problèmes mentionnés ci-dessus ont été testés avec le XPS Document (déjà mentionné ci-dessus) créé par notre application.

Création d'un travail d'impression avec PrintDialog.PrintDocument et Paginator:

Impression à partir de notre application donne une sortie compatible avec tous les systèmes: plus le document (parlant en terme de la taille du support de la page), la c'est plus flou. Malheureusement, beaucoup de causes potentielles ont déjà été omises. Le code for printing the document est assez simple.

• Au lieu d'utiliser notre propre Paginator, j'ai remplacé ce dernier par une autre partie Paginator des composants de diagramme MindFusion WPF que nous utilisons. J'ai atteint le même résultat. (Cette instruction est également vraie pour XPSDocuments enregistré en tant que fichier).

• J'ai utilisé le dernier pilote d'impression disponible

• Les modifications apportées à PrintTicket résolution ne semble pas affecter la ouput de quelque manière que

• Utiliser un autre visuel au lieu d'un schéma (comme la fenêtre de notre Application elle-même) n'affecte pas la sortie

En raison de ces différents problèmes, il semble que plusieurs causes sont également probables.Les exclusions précédentes m'amènent à supposer que certains paramètres cruciaux manquent dans le PrintTicket, ou quelque chose de terriblement mauvais se produit avec les scènes de XPS à GDI Conversion. En dehors de ces hypothèses, je suis à court d'idées.

Remarque: Tous les périphériques d'impression ont des pilotes non-XPS. HP Designjet 500, HP 2100

Last but not least, j'ai sérialisé le même PrintTicket utilisé pour le fichier de document XPS et le travail d'impression. Je serais reconnaissant si quelqu'un a connu des problèmes similaires. Toute suggestion est la bienvenue.

Répondre

0

J'ai actuellement le code de travail mais j'ai toujours des problèmes d'alignement. Mais l'impression n'est pas floue, je vous donne mon code dans l'espoir qu'il peut vous aider et nous pourrions tous les deux trouver une solution.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Documents; 
using System.Windows; 
using System.Windows.Media; 
using System.Diagnostics; 
using System.Globalization; 
using System.Windows.Controls; 
using System.Data; 

namespace VD 
{ 
    public class CustomPaginator : DocumentPaginator 
    { 
    private int _RowsPerPage; 
    private Size _PageSize; 
    private int _Rows; 
    public static DataTable dtToPrint; 

    public CustomPaginator() 
    { 

    } 
    public CustomPaginator(int rows, Size pageSize, DataTable dt) 
    { 
     _Rows = rows; 
     PageSize = pageSize; 
     dtToPrint = dt; 
    } 

    public override DocumentPage GetPage(int pageNumber) 
    { 
     int currentRow = _RowsPerPage * pageNumber; 

     var page = new PageElement(currentRow, Math.Min(_RowsPerPage, _Rows - currentRow)) 
     { 
     Width = PageSize.Width, 
     Height = PageSize.Height, 
     }; 

     page.Measure(PageSize); 
     page.Arrange(new Rect(new Point(0,0), PageSize));  

     return new DocumentPage(page); 
    } 

    public override bool IsPageCountValid 
    { get { return true; } } 

    public override int PageCount 
    { get { return (int)Math.Ceiling(_Rows/(double)_RowsPerPage); } } 

    public DataTable getDtProtols 
    { 
     get 
     { 
      return dtToPrint; 
     } 
    } 
    public override Size PageSize 
    { 
     get { return _PageSize; } 
     set 
     { 
     _PageSize = value; 

     _RowsPerPage = PageElement.RowsPerPage(PageSize.Height); 

     //Can't print anything if you can't fit a row on a page 
     Debug.Assert(_RowsPerPage > 0); 
     } 
    } 

    public override IDocumentPaginatorSource Source 
    { get { return null; } } 
    } 

    public class PageElement : UserControl 
    { 
    private const int PageMargin = 75; 
    private const int HeaderHeight = 25; 
    private const int LineHeight = 20; 
    private const int ColumnWidth = 140; 

    private CustomPaginator objParent = new CustomPaginator(); 
    private DataTable ProtocolsDT = null; 
    private int _CurrentRow; 
    private int _Rows; 

    public PageElement(int currentRow, int rows) 
    { 
     Margin = new Thickness(PageMargin); 
     _CurrentRow = currentRow; 
     _Rows = rows; 
    } 

    private static FormattedText MakeText(string text) 
    { 
     return new FormattedText(text, CultureInfo.CurrentCulture, 
     FlowDirection.LeftToRight, 
     new Typeface("Tahoma"), 14, Brushes.Black); 
    } 

    public static int RowsPerPage(double height) 
    { 
     return (int)Math.Floor((height - (2 * PageMargin) 
     - HeaderHeight)/LineHeight); 
    } 

    protected override void OnRender(DrawingContext dc) 
    { 
     ProtocolsDT = objParent.getDtProtols; 
     Point curPoint = new Point(0, 0); 

     dc.DrawText(MakeText("Host Names"),curPoint); 
     curPoint.X += ColumnWidth; 
     for (int i = 1; i < ProtocolsDT.Columns.Count; i++) 
     { 
      dc.DrawText(MakeText(ProtocolsDT.Columns[i].ToString()), curPoint); 
     curPoint.X += ColumnWidth; 
     } 

     curPoint.X = 0; 
     curPoint.Y += LineHeight; 

     dc.DrawRectangle(Brushes.Black, null, new Rect(curPoint, new Size(Width, 2))); 
     curPoint.Y += HeaderHeight - LineHeight; 

     Random numberGen = new Random(); 
     //for (int i = _CurrentRow; i < _CurrentRow + _Rows; i++) 
     //{ 
     // dc.DrawText(MakeText(ProtocolsDT.Rows[i][0].ToString()), curPoint); 
     //curPoint.X += ColumnWidth; 
     for (int j = 0; j < ProtocolsDT.Rows.Count; j++) 
     { 
      for (int z = 0; z < ProtocolsDT.Rows[j].ItemArray.Length; z++) 
      { 
       dc.DrawText(MakeText(ProtocolsDT.Rows[j].ItemArray[z].ToString()), curPoint); 
       curPoint.X += ColumnWidth; 
      } 
      curPoint.Y += LineHeight; 
      curPoint.X = 0; 
      //dc.DrawText(MakeText(ProtocolsDT.Rows[j].ItemArray[1].ToString()), curPoint); 
      //curPoint.X += ColumnWidth; 
      //dc.DrawText(MakeText(ProtocolsDT.Rows[j].ItemArray[2].ToString()), curPoint); 
      //curPoint.X += ColumnWidth; 
     //} 
     //curPoint.Y += LineHeight; 
     //curPoint.X = 0; 
     } 
    } 
    } 
} 


Another Class 

    private void PrintDataTable(DataTable dt) 
     { 
      var printDialog = new PrintDialog(); 
      if (printDialog.ShowDialog() == true) 
      {     
       var paginator = new CustomPaginator(dt.Rows.Count, 
        new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight),dt); 
       try 
       { 
        printDialog.PrintDocument(paginator, "Running Protocols Report"); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(this, "Unable to print protocol information. Please check your printer settings.", "VD", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK); 
       } 
      } 
     }