Мы используем FlowDocument
для печати нескольких персонализированных листовок и оставляем их для механизма печати WPF, чтобы разделить листовки, равномерно расположенные на странице (один лист заполняет всю ширину, зависит только количество листовок на страницена высоте листовки). Каждый буклет содержится в Paragraph
, который добавляется в коллекцию FlowDocument
. Blocks
. Все листовки имеют одинаковую высоту.
Листовки пронумерованы, но можно напечатать как можно больше страниц, получившиеся листы бумаги будут сложены, а затем обрезаны по горизонтали. Однако после обрезки мы получаем стопки листовок с нумерацией (1, [количество листовок на страницу] +1, 2 * [количество листовок на страницу] +1 для первой стопки; (2, [количество листовок на страницу)] +2, 2 * [количество листовок на странице] +2 для второго и четвертого.
Чего мы хотим добиться, так это чтобы листовка «2» лежала прямо под листовкой «1» после того, как мы отрежем сложенную стопкулисты бумаги. Для этого нам нужно знать количество листовок на странице. Но как мы можем это сделать ??
Код для печати следующий:
Dim dialog = MyBase.GetInitializedPrintDialog(PageOrientation.Portrait)
If dialog Is Nothing Then Return
Dim numberOfColumns = If(_options.ShowOpponentName, 1, 2)
Dim iDocument As IDocumentPaginatorSource = guidePrinter.GetPrintableDocument(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight, numberOfColumns)
dialog.PrintDocument(iDocument.DocumentPaginator, "Printing...")
GetInitializedPrintDialog
определяется так:
Protected Function GetInitializedPrintDialog(pageOrientation As PageOrientation) As PrintDialog
Dim dialog As New PrintDialog
Dim queue As PrintQueue
If ShowPrinterdialog Then
If dialog.ShowDialog <> True Then Return Nothing
queue = dialog.PrintQueue
Else
queue = LocalPrintServer.GetDefaultPrintQueue
End If
dialog.PrintQueue = queue
dialog.PrintTicket.PageOrientation = pageOrientation
Return dialog
End Function
GetPrintableDocument
определяется так:
Public Overridable Function GetPrintableDocument(pageWidth As Double, pageHeight As Double, Optional numberOfColumns As Integer = 1) As IDocumentPaginatorSource
Dim size = New Size(pageWidth, pageHeight)
SetPageSize(size, numberOfColumns)
Dim paginatedSource As IDocumentPaginatorSource = CType(Document, IDocumentPaginatorSource)
Return paginatedSource
End Function