Я уже давно борюсь с проблемой печати, надеюсь, кто-то может помочь.
Справочная информация Я создаю документ 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);
}
Теперь это кажется идеальным!Но я получаю два один вопрос (ы).
Текст на странице дублируется, так как кажется, что он печатается сначала со шрифтом по умолчанию, а затем со вторым моим специальным шрифтом поверх первого.См. Screencap: Извините за это, это было скрытое изображение внутри docx-файла, которое было выведено на передний план, когда каким-то образом преобразовано (даже скрыто в Word).
- Это медлительная собака ... для документа требуется целая вечность. Печать, даже если для печати требуется всего 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 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);
}
}
Хорошо, так что следуетЯ использую автоматизацию?Он печатается нормально, но когда дело доходит до закрытия приложения и документа, у меня возникают проблемы.Например, я иногда получаю диалоговое окно «Поля за пределами области печати» и указывает, что код не может выйти из процесса и покинуть его.Вы видите Thread.Sleep?Если у меня его там нет, Word закроется до окончания печати.
Понимаете, я терплю неудачу во всех попытках.Каков наилучший способ сделать это?
Спасибо за ваше время!