Я пытаюсь распечатать многостраничный файл, но вместо двух разных страниц я получаю две страницы с одним и тем же изображением.
Настройка теста:
Я сканирую несколько страниц в размолвка. Страницы помечены как «1», «2», «3», и если я открою файл с Windows предварительным просмотром изображения, появится несколько разных страниц. Как только я распечатываю файл в формате PDF или на физическом принтере, я получаю две страницы с одинаковым изображением. (Не обязательно на той же странице, так как я могу добавить текстовый блок с увеличивающимся номером страницы, который отображается правильно)
Как я это делаю, так:
Загрузка TIFF из файла через BitmapDecoder
BitmapDecoder decoder = BitmapDecoder.Create(new Uri(path), BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.OnLoad);
Итерация фреймов: foreach ImageFrame создает Frameworkelement его файл xaml с одним Imagecontrol (Интересно, если я добавлю страницу индекс он считает, но изображение остается прежним)
var count = decoder.Frames.Count;
for (int i = 0; i < count; i++)
{
var frame = decoder.Frames[i];
frame.Freeze();
var element = new PrintDocumentControl();
element.DataContext = new DocumentVm(new ImageData(frame));
this.internDocument.AddPage(element);
}
этот internDocument (список элементов кадра) затем преобразуется в FixedDocument следующим образом:
private FixedDocument CreateDocument()//TODO: change some element property to check whether there are two different frames
{
FixedDocument document = new FixedDocument();
document.DocumentPaginator.PageSize = PageSize;
double height = PageSize.Height;
double width = PageSize.Width;
foreach (var element in frameworkElements)
{
PageContent pageContent = new PageContent();
FixedPage fixedPage = new FixedPage();
element.Height = height;
element.Width = width;
fixedPage.Width = width;
fixedPage.Height = height;
fixedPage.Children.Add(element);
pageContent.Width = width;
pageContent.Height = height;
pageContent.Child = fixedPage;
document.Pages.Add(pageContent);
}
return document;
}
и отображается в DocumentViewer-Control
<DocumentViewer Grid.Column="1" Document="{Binding Document}"/>
Как только пользователь нажимает кнопку Печать, выполняется следующее:
if (document != null)
{
printDialog.PageRangeSelection = PageRangeSelection.AllPages; // added to check if this is where the problem occurs
printDialog.PrintDocument(document.DocumentPaginator, Description);
}
, где документ ранее был создан и отображен FixedDocument.
Надеюсь, это объяснение имеет смысл, я собираюсь около недели углубиться в эту проблему ...
Есть какие-нибудь предложения относительно того, где моя проблема может быть ie?
Параметр двусторонней печати отключен, а диапазон страниц - AllPages.
Для меня это выглядит как проблема с кэшированием изображения, поскольку дважды печатается только изображение, но не текстовый блок «dynamici c».
EDIT:
Мое подозрение что то, как я создаю FixedDocument, является ошибкой. Что делает это странным, так это то, что предварительный просмотр отображается правильно ... Запись FixedDocument во временный файл XPS приводит к одинаковому поведению: правильные две страницы, но одно и то же изображение на обеих страницах.
if (document != null)
{
string filename = System.Environment.GetEnvironmentVariable("TEMP") + @"\TempFixedDocument.xps";
System.IO.File.Delete(filename);
XpsDocument xpsd = new XpsDocument(filename, FileAccess.ReadWrite);
XpsDocumentWriter xw = XpsDocument.CreateXpsDocumentWriter(xpsd);
xw.Write(document);
printDialog.PrintDocument(xpsd.GetFixedDocumentSequence().DocumentPaginator, Description);
xpsd.Close();
}