我已经打了很长时间的打印问题,希望有人可以提供帮助。
背景 我正在从word-template创建Aspose.Words文档,并将其合并,然后想要使用打印对话框直接从WPF应用程序打印它。 打印时我需要能够为我的打印机选择所有不同的打印机设置(要使用的纸张,缩放,方向,颜色等)。最后一件事似乎是让我的Google搜索无法成功,因为我找到的所有示例只是提供打印机名称或要打印的副本数量。
测试1 - Aspose的首选打印方式 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);
}
现在这似乎是完美的!但我得到两个一个问题。
测试2 - 使用流程打印(PDF)
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();
}
这将是一个很好的解决方案,但它不会给我对话框(我可以使用PrintTo一词并提供一些参数,如打印机名称等。但不是我的特殊要求,对吗?)
测试3 - 使用Word Automation进行打印
private void Print(Document document)
{
object nullobj = Missing.Value;
var savePath = String.Format("C:\\temp\\a.docx");
document.Save(savePath, SaveFormat.Docx);
var wordApp = new Microsoft.Office.Interop.Word.Application();
wordApp.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone;
wordApp.Visible = false;
Microsoft.Office.Interop.Word.Document doc = null;
Microsoft.Office.Interop.Word.Documents docs = null;
Microsoft.Office.Interop.Word.Dialog dialog = null;
try
{
docs = wordApp.Documents;
doc = docs.Open(savePath);
doc.Activate();
dialog = wordApp.Dialogs[Microsoft.Office.Interop.Word.WdWordDialog.wdDialogFilePrint];
var dialogResult = dialog.Show(ref nullobj);
if (dialogResult == 1)
{
doc.PrintOut(false);
}
}catch(Exception)
{
throw;
}finally
{
Thread.Sleep(3000);
if (dialog != null) Marshal.FinalReleaseComObject(dialog);
if (doc != null) Marshal.FinalReleaseComObject(doc);
if (docs != null) Marshal.FinalReleaseComObject(docs);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
doc = null;
wordApp.Quit(false, ref nullobj, ref nullobj);
}
}
好的,我应该使用自动化吗?打印很好,但是当关闭word-app和文档时,我会遇到麻烦。例如,我有时会得到“可打印区域外的边距”对话框,并且代码不能退出进程并离开它。 你看到Thread.Sleep?如果我没有它,Word将在打印完成之前退出。
你知道,我的所有尝试都没有做到。最好的方法是什么?
谢谢你的时间!
答案 0 :(得分:2)
好的,我找到了一个合适的WPF解决方案,将文档转换为XPS并将其加载到DocumentViewer中,我可以使用本机打印功能。
<强> View.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