我在運行時生成了幾張影像,我需要列印它們。這些是條形碼,因此可以固定高度,但事先不知道數量,因此可能需要更多頁面。例如,每個 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;
}
感謝任何幫助,因為我已經列印了太多頁面!謝謝
uj5u.com熱心網友回復:
你可以使用它:
const double dPageWidth_Cm = 21.7;
const double dPageHeight_Cm = 29;
const double dBarcodeImgWidth_Px = 800;
const double dBarcodeImgHeight_Px = dBarcodeImgWidth_Px/4;
const double dVerticalSpacing_Cm = 5;
const double dVerticalSpacingInitial_Cm = dVerticalSpacing_Cm/ 2;
private FixedPage CreateOneFixedPage()
{
#region 0 Page
FixedPage page = new FixedPage();
page.Width = 96 * dPageWidth_Cm;
page.Height = 96 * dPageHeight_Cm;
#endregion
#region 1 Header
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);
#endregion
#region 2 Barcodes
for (int iii = 0; iii < numBarcodes; iii )
{
var img = new Image { Source = imgbarcode.Source };
FixedPage.SetLeft(img, 96 * dPageWidth_Cm / 2 - dBarcodeImgWidth_Px / 2);//from the center of the page half the img size
FixedPage.SetTop(img, 96 * (dVerticalSpacing_Cm * iii dVerticalSpacingInitial_Cm));
page.Children.Add((UIElement)img);
var tbkBarcode = new TextBlock();
tbkBarcode.Text = txtbarcodecontent.Text " " iii;
tbkBarcode.FontSize = 40;
FixedPage.SetLeft(tbkBarcode, 96 * dPageWidth_Cm / 2 - (MeasureTextBlock(tbkBarcode).Width / 2));
FixedPage.SetTop(tbkBarcode, 96 * (dVerticalSpacing_Cm * iii dVerticalSpacing_Cm / 2) dBarcodeImgHeight_Px);
page.Children.Add((UIElement)tbkBarcode);
}
#endregion
#region 3 Footer
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);
#endregion
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);
}
我不得不使用 MeasureTextBlock 函式,因為我無法獲得正常的 stackPanel 中心邏輯作業。因此,結果如下:

如果您需要更多頁面,只需重復邏輯并創建更多頁面
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512724.html
上一篇:使用懸停和CSS顯示一半影像
