如何在具有不同页面大小的单个页面上打印FlowDocument?

时间:2012-03-21 20:16:50

标签: c# wpf printing flowdocument

以下是我的情景:

我有一个文档,目前是FlowDocument,我想在两种不同的页面大小上打印。第一个是标准字母8.5乘11;另一种是便携式打印机,纸张长度为5。它在5x上打印得很好吗?但它打印在8.5x11的两页上。我希望8.5x11有两列,所以第一列流入第二列而不是第二页。我不想缩放整个东西,以便在一张8.5x11的单张纸上打印一个瘦小的列;这是不可读的。然而,一些缩放以使页面适合两列是可以的。它可以在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>

我曾尝试弄乱列宽,文档页面大小,缩放,添加包装面板,添加堆栈面板等等......我无法弄清楚这一点。这让我疯了!有人可以帮忙吗?

P.S。代码中的任何拼写错误都是由我引起的,因为我不得不从我的其他PC手动复制它。

1 个答案:

答案 0 :(得分:1)

所以,经过大量挖掘和玩弄价值并将FlowDocument添加到各种观众之后,我注意到大多数人询问有关FlowDocument打印的问题都有我遇到的相反问题。他们的解决方案是设置ColumnWidth。

我只是删除了

ColumnWidth="500"
来自FlowDocument的

我现在有了我想要的行为。在A4上打印两列,在单个列中打印在较小的假脱机纸上所需的长度。为清楚起见,我也没有在代码中的任何位置设置ColumnWidth。