如何在不同页面大小的单个页面上打印FlowDocument
本文关键字:单个页 打印 FlowDocument | 更新日期: 2023-09-27 18:28:39
这是我的场景:
我有一个文档,目前是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>
我试过打乱列宽、文档页面大小、缩放、添加换行面板、添加堆栈面板等……但我无法解决这个问题。它把我逼疯了!!有人能帮忙吗?
附言:代码中的任何拼写错误都是由我引起的,因为我必须手动从另一台电脑上复制它。
因此,在对值进行了更多的挖掘和处理,并将FlowDocument添加到各种查看器中之后,我注意到大多数询问FlowDocument打印问题的人都有与我相反的问题。他们的解决方案是设置ColumnWidth。
我只是简单地删除了
ColumnWidth="500"
从FlowDocument,我现在有了我想要的行为。在A4上分两列打印,在较小的假脱机纸上按所需长度打印一列。为了清楚起见,我也没有在代码中的任何位置设置ColumnWidth。