我一直在与打印问题作斗争很长时间,希望有人可以提供帮助。
背景 我正在从一个 word 模板创建一个 Aspose.Words 文档,并通过邮件将其合并,然后希望使用打印对话框直接从 WPF 应用程序打印它。打印时,我需要能够为我的打印机选择所有不同的打印机设置(使用什么纸张、缩放、方向、颜色等)。最后一件事似乎是让我的 Google 搜索无法成功的原因,因为我发现的所有示例都只是关于给出打印机名称或要打印多少份。
测试 1 - Aspose 的首选打印方式 来自他们的论坛
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);
}
现在这似乎是完美的!但我明白了二一个问题。
文本在页面上加倍,因为它似乎首先使用默认字体打印,其次使用我的特殊字体打印,第二个,在第一个之上。请参阅屏幕截图:抱歉,这是 docx 文件中的隐藏图像,以某种方式转换后出现在最前面(即使隐藏在 Word 中)。
- 它很慢...... document.Print 需要很长时间,即使它只有 2 页要打印,而且没有图形。
测试 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 自动化打印
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 将在打印完成之前退出。
你看,我所有的尝试都失败了。解决此问题的最佳方法是什么?
谢谢你的时间!