2012-03-15 16 views
2

私は長い間、印刷の問題で戦ってきました。うまくいけば誰かが助けてくれるでしょう。印刷設定(Asposeが生成された)でWPFからWord文書を印刷

背景 私はワードテンプレートからAspose.Wordsでは、文書を作成していて、メールがそれをマージし、印刷ダイアログでWPFアプリケーションから直接それを印刷したいです。 印刷するときに、自分のプリンタで使用できるすべての異なるプリンタ設定(使用する用紙、ズーム、向き、色など)を選択できる必要があります。この最後のことは、私が見つけたすべての例がプリンタ名を指定すること、または何枚の印刷を行うかということだけで、Googleの検索結果が成功するのを妨げているようです。

テスト1から From their forum

private void Print(Document document) 
    { 
     var printDialog = new System.Windows.Forms.PrintDialog 
     { 
      AllowSomePages = true, 
      PrinterSettings = new PrinterSettings 
      { 
       MinimumPage = 1, 
       MaximumPage = document.PageCount, 
       FromPage = 1, 
       ToPage = document.PageCount 
      }, 
      UseEXDialog = true 
     }; 

     var result = printDialog.ShowDialog(); 
     if (result.Equals(DialogResult.OK)) 
      document.Print(printDialog.PrinterSettings); 
    } 

を印刷するのAsposeの好ましい方法は、今、これは完璧のようです!しかし、私はと2つのを発行します。

  • テキストは、最初のデフォルトのフォントで印刷するようだと、ページ上で倍増し、第二私の特別なフォント秒で、最初の上にされています。 screencapを参照してください:これは申し訳ありませんが、それは何とか(Wordで非表示になっていても)変換されたときに前面に来たdocxファイル内の隠された画像でした。

The text is doubled on the page

  • それはそれだけで2印刷するページ、およびなしグラフィックスだにもかかわらず、document.Printのために永遠に取り...犬遅いです。

テスト2 - (私は単語PrintToを使用して、いくつかの引数を与えることができます。これは、素敵な解決策になるだろうが、それは私のダイアログを与えるものではありません

private void Print(Document document) 
    { 
     var savePath = String.Format("C:\\temp\\a.pdf"); 
     document.Save(savePath, SaveFormat.Pdf); 

     var myProcess = new Process(); 
     myProcess.StartInfo.FileName = savePath; 
     myProcess.StartInfo.Verb = "Print"; 
     //myProcess.StartInfo.CreateNoWindow = true; 
     myProcess.Start(); 
     myProcess.WaitForExit(); 
    } 

(PDF)プロセスで印刷?、右、プリンタ名などのようにでもなく、私の特別な要件のため)

テスト3 - Wordのオートメーションで

を印刷

私はオートメーションを使用する必要がありますか?それはうまく印刷されますが、単語アプリとドキュメントを閉じるときには問題が発生します。たとえば、「印刷可能領域外の余白」というダイアログが表示され、コードがプロセスを終了して終了することができない場合があります。 Thread.Sleepが表示されますか?私はそれを持っていない場合、Wordは印刷が終了する前に終了されます。

あなたは私のすべての試みには不足しています。これについて最善の方法は何ですか?

ありがとうございました!

答えて

2

OK、ドキュメントをXPSに変換し、DocumentViewerに読み込んでネイティブプリント機能を使用できる、適切なWPFソリューションを見つけました。

見る。XAML

<DocumentViewer Document="{Binding XpsFixedDocumentSequence}"/> 

ViewModel.cs

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

private void PrepareDocument(Document document) 
{ 
    var xpsDoc = GetDocumentAsXps(document); 
    XpsFixedDocumentSequence = xpsDoc.GetFixedDocumentSequence(); 
} 

private XpsDocument GetDocumentAsXps(Document document) 
{ 
    var savePath = "C:\\temp\\doc.xps"; 
    document.Save(savePath, SaveFormat.Xps); 
    var xpsDoc = new XpsDocument(savePath, FileAccess.Read); 
    return xpsDoc; 
} 

/* Property XpsFixedDocumentSequence */ 
public const string XpsFixedDocumentSequencePropertyName = "XpsFixedDocumentSequence"; 
private FixedDocumentSequence _xpsFixedDocumentSequence; 
public FixedDocumentSequence XpsFixedDocumentSequence 
{ 
    get { return _xpsFixedDocumentSequence; } 

    set 
    { 
     if (_xpsFixedDocumentSequence == value) return; 
     _xpsFixedDocumentSequence = value; 
     RaisePropertyChanged(XpsFixedDocumentSequencePropertyName); 
    } 
} 

自己への注意:ReachFramework DLLを参照する

関連する問題