Как определить количество блоков на странице в FlowDocument? - PullRequest
0 голосов
/ 22 октября 2019

Мы используем 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
...