Экспорт страниц FlowDocument в файл PNG
У меня есть требование распечатать изображения, представленные в определенном каталоге, без запуска / рендеринга в любом UIElement на дисплее, например, tableView
поэтому я решил использовать FlowDocument
Но я столкнулся с проблемой при сохранении страницы FlowDocument в виде изображений (некоторые изображения не отображаются и отображаются как черные, я приложил снимок экрана с проблемой), уже обсуждавшиеся на форуме Msdn
Я приложил мой код ниже
FlowDocumentReader flowDocumentReader = new FlowDocumentReader();
FlowDocument flowDocument = new FlowDocument();
Table table = new Table();
flowDocumentReader.Document = flowDocument;
flowDocument.Blocks.Add(table);
flowDocument.LineHeight = 116.4;
flowDocument.PageHeight = 745.6;
flowDocument.ColumnWidth = 999999999;
table.Columns.Add(new TableColumn() { Width = new GridLength(30) });
table.Columns.Add(new TableColumn() { Width = new GridLength(279) });
table.Columns.Add(new TableColumn() { Width = new GridLength(279) });
table.Columns.Add(new TableColumn() { Width = new GridLength(279) });
var imageFilePaths = Directory.GetFiles(@"C:\Images", "*.jpg").ToList();
for (int i = 0; i < imageFilePaths.Count; i++)
{
if (i % 4 <= 0)
{
var tableRowGroupCol = new TableRowGroup() { Background = Brushes.Black };
var tableRowCol = new TableRow();
tableRowGroupCol.Rows.Add(tableRowCol);
table.RowGroups.Add(tableRowGroupCol);
tableRowCol.Cells.Add(new TableCell() { Background = Brushes.LightGray, LineHeight = 30 });
var par = new Paragraph();
var header = new TextBlock
{
Text = "Col1",
TextWrapping = TextWrapping.WrapWithOverflow,
};
par.Inlines.Add(header);
tableRowCol.Cells.Add(new TableCell(par) { Background = Brushes.LightGray, LineHeight = 30 });
var par2 = new Paragraph();
var header2 = new TextBlock
{
Text = "Col2",
TextWrapping = TextWrapping.WrapWithOverflow,
};
par2.Inlines.Add(header2);
tableRowCol.Cells.Add(new TableCell(par2)
{ Background = Brushes.LightGray, LineHeight = 30 });
var par3 = new Paragraph();
var header3 = new TextBlock
{
Text = "Col3",
TextWrapping = TextWrapping.WrapWithOverflow,
};
par3.Inlines.Add(header3);
tableRowCol.Cells.Add(new TableCell(par3) { Background = Brushes.LightGray, LineHeight = 30 });
}
var tableRowGroup = new TableRowGroup() { Background = Brushes.Black };
var tableRow = new TableRow();
tableRowGroup.Rows.Add(tableRow);
table.RowGroups.Add(tableRowGroup);
for (int j = 0; j < 4 && (j * i) < imageFilePaths.Count; j++)
{
var paragraph = new Paragraph();
if (j != 0)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(imageFilePaths[i * j], UriKind.Absolute);
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
var image = new Image() { Source = bitmap };
image.Height = 116.4;
paragraph.Inlines.Add(image);
}
else
{
var textBlock = new TextBlock
{
Text = "row-" + i,
TextWrapping = TextWrapping.WrapWithOverflow,
};
paragraph.Inlines.Add(textBlock);
}
tableRow.Cells.Add(new TableCell(paragraph) { Background = j != 0 ? Brushes.White : Brushes.LightGray });
}
}
DocumentPaginator dp = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator;
dp.ComputePageCount();
for (int i = 0; i < dp.PageCount; i++)
{
var rtb = new RenderTargetBitmap((int)dp.PageSize.Width, (int)dp.PageSize.Height, 96, 96, PixelFormats.Pbgra32);
rtb.Render(dp.GetPage(i).Visual);
var enc = new PngBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(rtb));
using (var stm = System.IO.File.Create(folderPath + fileName))
{
enc.Save(stm);
}
}
Может ли помочь мне решить проблему
Спасибо
Сантош Деви