【发布时间】:2012-03-22 22:10:36
【问题描述】:
这是我的场景:
我有一个文档,目前是 FlowDocument,我想在两种不同的页面尺寸上打印。第一个是标准字母 8.5 x 11;另一台是便携式打印机,长度为 5,与纸轴一样长。 5倍打印效果好吗?但它打印在 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>
我尝试过弄乱列宽、文档页面大小、缩放、添加环绕面板、添加堆栈面板等……但我无法弄清楚。它快把我逼疯了!!有人可以帮忙吗?
附:代码中的任何拼写错误都是我自己造成的,因为我不得不从另一台 PC 上手动复制它。
【问题讨论】:
-
我在 FlowDocument 中看不到任何列。通过 FlowDocumentViewer 的列是 UI 呈现。我似乎您的代码正在打印 FlowDocument 而不是 FlowDocumentViewer 渲染。
-
FlowDocument 永远不会显示给用户。它包含的数据在程序其他地方的一堆用户控件中进行编辑。我想打印它而不必先显示它。
-
FlowDocument 是否包含列?
-
据我了解,您不会在 FlowDocument 中显式创建列,它们是在您设置 ColumnWidth 属性时动态创建的。我已经完成并搞砸了,还尝试将 IsContentWidthFlexible 设置为 false。
标签: c# wpf printing flowdocument