Печать документа Word из WPF с настройками печати (сгенерировано Aspose) - PullRequest
2 голосов
/ 15 марта 2012

Я уже давно борюсь с проблемой печати, надеюсь, кто-то может помочь.

Справочная информация Я создаю документ 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).

The text is doubled on the page

  • Это медлительная собака ... для документа требуется целая вечность. Печать, даже если для печати требуется всего 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 закроется до окончания печати. ​​

Понимаете, я терплю неудачу во всех попытках.Каков наилучший способ сделать это?

Спасибо за ваше время!

1 Ответ

2 голосов
/ 16 марта 2012

ОК, я нашел правильное 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...