Печать PowerShell WPF - не удается получить интерфейс IDocumentPaginatorSource - PullRequest
0 голосов
/ 13 ноября 2010

Я пытаюсь использовать печать WPF из PowerShell. Я нашел простой пример в VB.Net здесь :

'Create a new Run class, passing it the text.
' The Run class contains 1 line of text
Dim r As New Run(text)

'Create a new paragraph, passing it the new run class instance
Dim ph As New Paragraph(r)

'Create the document, passing a new paragraph
Dim doc As New FlowDocument(ph)
doc.PagePadding = New Thickness(100) 'Creates margin around the page

'Send the document to the printer
diag.PrintDocument( _
    CType(doc, IDocumentPaginatorSource).DocumentPaginator, _
    printCaption)

но я не могу преобразовать его в PowerShell. Вот моя попытка:

$run = New-Object System.Windows.Documents.Run('text')
$paragraph = New-Object System.Windows.Documents.Paragraph($run)
$flowDocument = New-Object System.Windows.Documents.FlowDocument($paragraph)

$thickness = New-Object System.Windows.Thickness(100)
$flowDocument.PagePadding = $thickness

$flowDocument -is [System.Windows.Documents.IDocumentPaginatorSource]
$source = $flowDocument -as [System.Windows.Documents.IDocumentPaginatorSource]

$source.DocumentPaginator -eq $null

$printDialog = New-Object System.Windows.Controls.PrintDialog
$printDialog.PrintDocument($source.DocumentPaginator, "test")

$ source.DocumentPaginator имеет значение null, и возникает исключение. (Работает код VB.Net)

[редактировать]

Вот еще одна попытка, которая не удалась:

Add-Type -Assembly 'ReachFramework'

$flowDocument = New-Object System.Windows.Documents.FlowDocument

$textRange = New-Object System.Windows.Documents.TextRange(
    $flowDocument.ContentStart, $flowDocument.ContentEnd)

$textRange.Text = 'Text'

$xpsDocument = New-Object System.Windows.Xps.Packaging.XpsDocument(
    "C:\scripts\test.xps", [System.IO.FileAccess]::ReadWrite)

$xpsDocumentWriter = 
    [System.Windows.Xps.Packaging.XpsDocument]::CreateXpsDocumentWriter(
    $xpsDocument)

$source = $flowDocument -as [System.Windows.Documents.IDocumentPaginatorSource]

$xpsDocumentWriter.Write($source.DocumentPaginator)

$xpsDocument.Close()

Я пытался использовать одну из перегрузок XpsDocumentWriter.Write () для отправки FlowDocument на принтер, но не удалось, $ source.DocumentPaginator имеет значение null. Мне даже не удалось создать файл .xps и сохранить его.

1 Ответ

1 голос
/ 16 ноября 2010

Иногда, когда я расстраиваюсь из-за языковых «проблем» PowerShell, я возвращаюсь к C #, что очень легко делает V2.Следующие распечатки для меня:

$src = @'
public static System.Windows.Documents.DocumentPaginator 
    GetDocumentPaginator(System.Windows.Documents.FlowDocument flowDocument)
{
    return ((System.Windows.Documents.IDocumentPaginatorSource)flowDocument).DocumentPaginator;
}
'@

Add-Type -MemberDefinition $src -Name Utils -Namespace Foo `
         -ReferencedAssemblies WindowsBase,PresentationFramework,
                               PresentationCore

$run = New-Object System.Windows.Documents.Run('text') 
$paragraph = New-Object System.Windows.Documents.Paragraph($run) 
$flowDocument = New-Object System.Windows.Documents.FlowDocument($paragraph) 

$thickness = New-Object System.Windows.Thickness(100) 
$flowDocument.PagePadding = $thickness 

$paginator = [Foo.Utils]::GetDocumentPaginator($flowDocument)

$printDialog = New-Object System.Windows.Controls.PrintDialog 
$printDialog.PrintDocument($paginator, "test") 

Обратите внимание, что вы можете сделать то же самое с кодом VB.Просто используйте параметр -Language VisualBasic на Add-Type.

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