我通过将FixedPages
添加到PageContents
,然后以某种方式将它们添加到FixedDocument
中来创建FixedDocument
,就像这样
FixedDocument fd = new FixedDocument();
// add FixedPages in PageContent to fd
用PrintDialog
打印它们,像这样
pdialog.PrintDocument(fd.DocumentPaginator, "Test");
结果显示正确的页数。但是,打印的每一页 - 例如PDF - 都是第一页的内容。
我尝试测试我添加到FixedPages
ImageSources
,这些似乎是正确的。我还用这样的DocumentViewer
测试了最终FixedDocument
Window wnd = new Window();
DocumentViewer viewer = new DocumentViewer();
viewer.Document = fd;
wnd.Content = viewer;
try
{
wnd.Show();
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
这奇怪地显示了我期望的正确输出。更奇怪的是,我在wnd.Show();
后得到了一个IOException
(这就是为什么我用尝试/捕获包围它的原因(。即使有尝试捕获,我也只能在我的MainWindow
抛出相同的IOException
之前查看它 1-2 秒。像"错误的用户名或密码"这样的东西 - 这没有意义,因为我尝试打印的图像是本地图像。
撇开DocumentViewer
不谈,我对Print()
方法仅打印第一页 n 次(n 是它应该是的实际页数(的问题仍然存在,只是认为DocumentViewer
中的异常可能会让某人了解潜在的问题。
这可能是FixedDocument始终打印第一页的可能副本 - 但是他没有提到DocumentViewer
的问题,并且问题仍未得到解答。
提前感谢任何帮助!
我遇到了类似的问题,从包含图像源列表(用户照片(的数据列表中在固定文档中打印标签,并且还动态创建来自用户 id 的整数的 QRCode 图像。
图像的格式是从我用来定位每个标签的文本字段和图像的自定义用户控件创建的。 当我在 DocumentViewer 控件中查看创建的文档时,它完美地显示。正确的照片图像,每个标签的正确QRCode图像。但是,当我打印文档(或保存到PDF文件或XPS文件(时,Ever Label在标签上的照片和QRCode图像位置中只有第一个图像。
当我遇到这篇文章时,我想我会尝试保存然后按照建议重新加载图像,这奏效了!!但是,每页 30 个标签的 IO 开销以及许多页标签意味着这不是一个非常有用的解决方法!我
然后发现简单地将 ImageSource 转换为 ByteArray,然后再转换回来,然后再添加到 FixedDocument 也可以,但没有增加 IO 开销。不是很优雅,但一个星期以来一直让我头疼!!
下面是生成标签的方法主体中的代码片段:
var qr = GetQRCodeImage(playerId); // Gets ImageSource
var ph = LoadImage(data[dataIndex].Photo); // Gets ImageSource
var qrCode = FixDocumentCacheImageBugFix(qr); // Gets ImageSource
if (ph != null) {
var photo = FixDocumentCacheImageBugFix(ph);
label = new AveryBarcodeLabel(line1, line2, line3, qrCode, photo); // Calls constructor to instantiate new Label with new ImageSources
}
else {
label = new AveryBarcodeLabel(line1, line2, line3, qrCode); // Calls constructor to instantiate new Label with new ImageSources (where photo is null)
}
这是我用来"修复"图像的方法
public static ImageSource FixDocumentCacheImageBugFix(ImageSource image) {
var bytes = ImageSourceToBytes(image);
return ByteToImage(bytes);
}
public static ImageSource ByteToImage(byte[] imageData) {
var biImg = new BitmapImage();
var ms = new MemoryStream(imageData);
biImg.BeginInit();
biImg.StreamSource = ms;
biImg.EndInit();
ImageSource imgSrc = biImg;
return imgSrc;
}
public static byte[] ImageSourceToBytes(ImageSource imageSource) {
byte[] bytes = null;
var bitmapSource = imageSource as BitmapSource;
if (bitmapSource != null) {
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
using (var stream = new MemoryStream()) {
encoder.Save(stream);
bytes = stream.ToArray();
}
}
return bytes;
}
所以,这并不是为什么会发生的答案,但我至少找到了罪魁祸首:我的形象。
我正在加载一个多页 LZW 压缩的 TIFF,如下所示:
TiffBitmapEncoder encoder = new TiffBitmapEncoder();
foreach (ImageSource frame in encoder.Frames)
{
frame.Freeze();
Images.Add(frame);
}
其中Images
是ImageSource
的集合。它们在应用程序中显示正常,我也可以使用TiffBitmapEncoder
再次保存它们,但是使用 WPF 打印它们最终会出现上述问题以及 - 使用DocumentViewer
时 - 一个异常告诉我"错误的用户名或密码",这没有意义。
我发现图像有问题的方法是使用PngBitmapEncoder
暂时保存TIFF的单个ImageSources
,并立即将具有相同编码器的单独文件中的页面重新加载到我Images
集合中的同一插槽中。
由于这没有任何问题(我的DocumentViewer
中没有用户名/密码例外,并且我的打印工作正常(,我不得不假设他不喜欢 TIFF 格式。
这并不能回答我的基本问题,即为什么它不起作用,但由于这至少是一种有效的解决方法,所以我只是把它放在这里,暂时不要检查"已回答"标记。
也许有人知道为什么我的TIFFImageSource
产生了这些奇怪的结果?