在带有预览的纸质表格上打印
本文关键字:表格 打印 | 更新日期: 2023-09-27 18:03:39
我们有一大堆需要填写的纸质表格。手工完成这些非常繁琐,所以我们正在构建一个应用程序。它应该提供一个表格来填写数据,能够显示打印预览,将数据打印在纸质表格上,并保留历史记录。
目前,我们有一个FixedPage
,我们这样打印:
var dlg = new PrintDialog();
if (dlg.ShowDialog() == true)
{
var doc = new FixedDocument();
doc.DocumentPaginator.PageSize = new Size(11.69 * 96, 8.27 * 96); // A4 Landscape
var fp = Application.LoadComponent(new Uri("/FixedPage.xaml", UriKind.Relative)) as FixedPage;
fp.DataContext = this;
fp.UpdateLayout();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
doc.Pages.Add(pc);
dlg.PrintTicket.PageOrientation = System.Printing.PageOrientation.Landscape;
dlg.PrintDocument(doc.DocumentPaginator, string.Format("Form #{0}", FormNumber));
}
对于打印预览,我们有一个自定义的UserControl
,背景是纸质表单的扫描图像,前景是数据。基本上,它在重复FixedPage
布局,所有这些都让我们认为我们的设计有缺陷。
有更好的方法来做我们想做的吗?
我也面临同样的问题,我想避免编写我自己的模板系统,以节省时间、单元测试和我的理智。
我最后写了一个混合器来做一些很酷的事情。首先,我使用HTML和CSS编写模板。这是非常容易做到的,并允许很大的灵活性时,从我们的市场部门进行微调。
我用我自己的标签填充了模板(例如[code_type/], [day_list]…[/day_list]), string用一个可以是单值或多值的标签字典替换了文本。
生成html后,我会使用一个html到pdf的库,我发现它使用开源的webkit引擎来渲染和创建生成的pdf。结果非常稳定,花了大约2周的时间来编写初始程序。每个人都很高兴,测试是轻而易举的。
如果您想了解更多细节,请给我发消息或回复这个
我们已经设法找到了一个解决方案,它允许我们丢弃一堆多余的代码。它还是很丑:
public class CustomDocumentViewer : DocumentViewer
{
public static readonly DependencyProperty BackgroundImageProperty =
DependencyProperty.Register("BackgroundImage", typeof(Image), typeof(CustomDocumentViewer), new UIPropertyMetadata(null));
public Image BackgroundImage
{
get { return GetValue(BackgroundImageProperty) as Image; }
set { SetValue(BackgroundImageProperty, value); }
}
protected override void OnDocumentChanged()
{
(Document as FixedDocument).Pages[0].Child.Children.Insert(0, BackgroundImage);
base.OnDocumentChanged();
}
protected override void OnPrintCommand()
{
var printDialog = new PrintDialog();
if (printDialog.ShowDialog() == true)
{
(Document as FixedDocument).Pages[0].Child.Children.RemoveAt(0);
printDialog.PrintDocument(Document.DocumentPaginator, "Test page");
(Document as FixedDocument).Pages[0].Child.Children.Insert(0, BackgroundImage);
}
}
}
...
<local:CustomDocumentViewer x:Name="viewer" BackgroundImage="{StaticResource PaperFormImage}"/>
...
InitializeComponent();
viewer.Document = Application.LoadComponent(new Uri("/PaperFormDocument.xaml", UriKind.Relative)) as IDocumentPaginatorSource;
我们使用Application.LoadComponent
而不是绑定的原因是一个五年前的bug: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=293646