As the name says, FlexReport provides flexibility when it comes to meeting reporting needs. Its powerful engine provides control over the rendering and printing processes in various ways. Recently, we received a support question where the requirement was to switch printers between pages of a report. Our customer wanted even-numbered pages of their report to be printed from one printer, and the odd-numbered pages from another. Seems a bit tricky, but it's not.
In this blog post, we'll go over how to print pages of a FlexReport from multiple printers.
Let’s say you have a report called FlexReport1 that has 10 pages, and you want to print all the even-numbered pages using Printer X, and the odd-numbered pages using Printer Y. In this case, you'll need to create two instances of FlexReport, and add the even- and odd-numbered pages from FlexReport1 as images. Using FlexReport’s GetPageImage method, you can get a page’s metafile, which can further be added in the two instances of reports depending on the odd- and even-numbered pages.
You can use the following C# code to print your reports from different printers:
double _preTopEven = 0.0;
double _preTopOdd = 0.0;
for (int i = 0; i < c1FlexReport1.PageCount; i++)
{
if (i % 2 == 0)
{
ImageField im = new ImageField();
im.AutoHeight = AutoSizeBehavior.CanGrow;
im.AutoWidth = AutoSizeBehavior.CanGrow;
Metafile mf = c1FlexReport1.GetPageImage(i);
im.Picture = mf;
im.SplitVertBehavior = SplitBehavior.Never;
im.SplitHorzBehavior = SplitBehavior.Never;
im.Top = _preTopEven;
_preTopEven += _flexEven.Layout.PageSize.Height;
_flexEven.Sections.Detail.Fields.Add(im);
}
else
{
ImageField im = new ImageField();
im.AutoHeight = AutoSizeBehavior.CanGrow;
im.AutoWidth = AutoSizeBehavior.CanGrow;
Metafile mf = c1FlexReport1.GetPageImage(i);
im.Picture = mf;
im.SplitVertBehavior = SplitBehavior.Never;
im.SplitHorzBehavior = SplitBehavior.Never;
im.Top = _preTopOdd;
_preTopOdd += _flexOdd.Layout.PageSize.Height;
_flexOdd.Sections.Detail.Fields.Add(im);
}
}
_flexEven.GenerateAsync().ContinueWith(t =>
{
PrinterSettings ps1 = new PrinterSettings();
ps1.PrinterName = "Printer 1";
ps1.PrintFileName = "file1";
_flexEven.Print(ps1);
});
if (c1FlexReport1.PageCount>1)
{
_flexOdd.GenerateAsync().ContinueWith(t =>
{
PrinterSettings ps2 = new PrinterSettings();
ps2.PrinterName = "Printer 2";
ps2.PrintFileName = "file2";
_flexOdd.Print(ps2);
});
}
You can modify the above code for your own printing needs. If there's any requirement you need us to explain, please mention in the comments.