Как напечатать FlowDocument на одной странице с разными размерами страницы? - PullRequest
1 голос
/ 22 марта 2012

Вот мой сценарий:

У меня есть документ, в настоящее время FlowDocument, который я хотел бы напечатать на двух разных размерах страницы.Первая - стандартная буква 8.5 на 11;другой - портативный принтер, и его длина составляет 5 штук.На 5х печатает нормально?но он распечатывается на двух страницах размером 8,5х11.Я хочу, чтобы 8.5x11 имел два столбца, поэтому первый столбец перетекает во второй столбец, а не на вторую страницу.Я НЕ хочу масштабировать все это так, чтобы оно печаталось в одной тонкой колонке на одном листе размером 8,5х11;это нечитаемоНекоторое масштабирование, чтобы уместить страницу в два столбца, все в порядке.Он хорошо печатает на бумаге обоих форматов из Xamlpad, но не из моей программы.Таким образом, это должно быть возможно, однако, для жизни меня, я не могу понять это.

Мой класс принтера:

public void Print(MyViewModel Data) {
    IDocumentPaginator flowDoc = RenderFlowDocumentTemplate(pathToFlowDocument, data);
    PrintDocumentImageableArea area = null;
    XpsDocumentWriter xpsDocWriter = PrintQueue.CreateXpsDocumentWriter(ref area);

    if (xpsDocWriter != null) {
        PrintFlowDocument(xpsDocWriter, flowDoc.DocumentPaginator, area);
    }
}

private IDocumentPaginator RenderFlowDocumentTemplate(string path, MyViewModel Data) {
    string rawXamlText = "";
    using (StreamReader streamReader = File.OpenText(templatePath)) {
        rawXamlText = streamReader.ReadToEnd();
    }

    FlowDocument doc = XamlReader.Load(new XmlTextReader(new StringReader(rawXamlText)) as FlowDocument;

    if (data != null) {
        doc.DataContext = data;
    }

    return doc;
}

private void PrintFlowDocument(XpsDocumentWriter writer, DocumentPaginator document, PrintDocumentImageableArea area) {
    document.PageSize = new Size(area.ExtentWidth, area.ExtentHeight);
    PrintDocumentPaginator(writer, document);
}

private void PrintDocumentPaginator(XpsDocumentWriter xpsDocWriter, DocumentPaginator document) {
    try {
        xpsDocWriter.Write(document);
    }
    catch (PrintSystemException) {}
}

А вот очень урезанная версия моего FlowDocument:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              Background="White"
              ColumnWidth="500">
    <FlowDocument.Resources>...some resources...</FlowDocument.Resources>
    <Paragraph />
    <BlockUIContainer>
        <Grid />
    </BlockUIContainer>
    .
    .
    .
    <Section />
</FlowDocument>

Я пробовал возиться с шириной столбца документаразмер страницы, масштабирование, добавление панелей переноса, добавление панелей стека и т. д., и я не могу понять это.Это сводит меня с ума!Кто-нибудь может помочь?

PS Любые опечатки в коде сделаны мной, поскольку мне пришлось копировать его вручную с другого компьютера.

1 Ответ

1 голос
/ 22 марта 2012

Итак, после еще большей копания и игры со значениями и добавления FlowDocument к различным средствам просмотра, я заметил, что у большинства людей, задающих вопросы о печати FlowDocument, возникла противоположная проблема, с которой я столкнулся.И их решением было установить ColumnWidth.

Я просто удалил

ColumnWidth="500"

из FlowDocument, и теперь у меня есть поведение, которое я хочу.Печатает в двух столбцах на А4 и печатает в одном столбце нужной длины на меньшей буферной бумаге.И для ясности, я также не устанавливаю ColumnWidth нигде в коде.

...