【问题标题】:How to print several images per page如何每页打印多个图像
【发布时间】:2022-10-04 17:48:58
【问题描述】:

我在运行时生成了几张图像,我需要打印它们。 这些是条形码,因此可以固定高度,但事先不知道数量,因此可能需要更多页面。例如,每个 A4 页面最多可以容纳 4 张图像。在图像下方,带有条形码内容的文本框可能会有所帮助,但这不是必需的。

对于打印我使用

PrintDialog printDialog = new PrintDialog();
bool? pdResult = printDialog.ShowDialog();
if (pdResult != null && pdResult.Value)
{
    FixedDocument document = CreateFixedDocument();
    printDialog.PrintDocument(document.DocumentPaginator, "ID Card Printing");
}

这很容易。但在我需要创建页面之前

private FixedDocument CreateFixedDocument()
{
    FixedDocument fixedDocument = new FixedDocument();
    fixedDocument.DocumentPaginator.PageSize = new Size(???); <---have not understood how to set A4 here

        //for (int i = 0; i < (numBarcodes/4); i++)
        {
            PageContent page = new PageContent();
            FixedPage fixedPage = CreateOneFixedPage();
            ((IAddChild)page).AddChild(fixedPage);
            fixedDocument.Pages.Add(page);
        }
        return fixedDocument;
    }

然后更复杂的是我创建了一页

private FixedPage CreateOneFixedPage()
{
    FixedPage page = new FixedPage();
    page.Width = ???
    page.Height = ???

    TextBlock tbTitle = new TextBlock();
    tbTitle.Text = <----------the barcode content
    tbTitle.FontSize = 24;
    tbTitle.Foreground = new SolidColorBrush(Colors.White);
    tbTitle.FontFamily = new FontFamily("Arial");
    FixedPage.SetLeft(tbTitle, ????)
    FixedPage.SetTop(tbTitle, ?????)
    page.Children.Add((UIElement)tbTitle);

    Image image = new Image
    {

        Height = 30,
        Width = 30
    };
    image.Source = imgbarcode.Source;

    
    FixedPage.SetLeft(b, ???);
    FixedPage.SetTop(b, ???); // top margin
    page.Children.Add((UIElement)b);

    //measure size of the layout
    Size sz = new Size(???);
    page.Measure(sz);
    page.Arrange(new Rect(new Point(), sz));
    page.UpdateLayout();

    return page;
}

感谢任何帮助,因为我已经打印了太多页面! 谢谢

【问题讨论】:

    标签: c# wpf image printing fixeddocument


    【解决方案1】:

    你可以使用它:

    const double dPageWidth_Cm = 21.7;
    const double dPageHeight_Cm = 29;
    const double dImageWidth_Px = 1000;
    const double dImageHeight_Px = dImageWidth_Px/4;
    double dVerticalSpacing = 5;
    
    private FixedPage CreateOneFixedPage()
    {
        FixedPage page = new FixedPage();
        page.Width = 96 * dPageWidth_Cm;
        page.Height = 96 * dPageHeight_Cm;
    
        var tbkTitle = new TextBlock();
        tbkTitle.Text = "Title for Barcodes";
        tbkTitle.HorizontalAlignment = HorizontalAlignment.Center;
        tbkTitle.TextAlignment = TextAlignment.Center;
        tbkTitle.FontSize = 80;
        FixedPage.SetLeft(tbkTitle, 96 * (dPageWidth_Cm / 2) - (MeasureTextBlock(tbkTitle).Width / 2));
    
        page.Children.Add((UIElement)tbkTitle);
    
    
        for (int iii = 0; iii < numBarcodes; iii++)
        {
            var sp = new StackPanel() { Orientation = Orientation.Vertical,  HorizontalAlignment = HorizontalAlignment.Center };
            FixedPage.SetLeft(sp, 96 * dPageWidth_Cm/2 - dImageWidth_Px / 2);
            FixedPage.SetTop(sp, 96 * (dVerticalSpacing*iii + dVerticalSpacing/2)  );
    
            var img = new Image { Source = imgbarcode.Source };
    
            var tbBarcode = new TextBlock();
            tbBarcode.Text = txtbarcodecontent.Text +"  " + iii;
            tbBarcode.FontSize = 40;
    
            sp.Children.Add(img);
            sp.Children.Add(tbBarcode);
            page.Children.Add((UIElement)sp);
        }
    
    
    
        var tbkFooter = new TextBlock();
        tbkFooter.Text = "Footer for Barcodes";
        tbkFooter.HorizontalAlignment = HorizontalAlignment.Center;
        tbkFooter.TextAlignment = TextAlignment.Center;
        tbkFooter.FontSize = 40;
        FixedPage.SetLeft(tbkFooter, 96 * (dPageWidth_Cm / 2) - (MeasureTextBlock(tbkFooter).Width / 2));
        FixedPage.SetBottom(tbkFooter, 0);
        page.Children.Add(tbkFooter);
    
    
        return page;
    }
    
    private Size MeasureTextBlock(TextBlock tbk)
    {
        var formattedText = new FormattedText(tbk.Text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
            new Typeface(tbk.FontFamily, tbk.FontStyle, tbk.FontWeight, tbk.FontStretch),tbk.FontSize,
            Brushes.Black, new NumberSubstitution(), 1);
            return new Size(formattedText.Width, formattedText.Height);
    }
    

    我不得不使用 Measure TextBlock 函数,因为我无法让正常的 stackPanel 中心逻辑工作。 因此,结果如下:

    如果您需要更多页面,只需重复逻辑并创建更多页面

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      相关资源
      最近更新 更多