过去几个月,我一直在开发一个使用 Windows 8.1 PDF API 的应用程序。它在各种设备上都表现出色,包括:
- 我的开发电脑运行 8.1 Pro
- 一台运行 Windows 8.1 Pro 的笔记本电脑(不支持触控)
- 运行 Windows 8.1 Pro 的虚拟机
- 运行 Windows 8.1 Enterprise 的虚拟机
- 运行 Windows Embedded 8.1 Industry Pro 的虚拟机
- 运行 Windows 8.1 Pro 的迷你电脑
- 运行 Windows 8.1 Home 的三星平板电脑
但是,我们最近购买了两台 Surface 2 RT 来运行此应用程序,但现在我们遇到了一个奇怪的问题。我已将问题范围缩小到 PDF API。在下面的 PNG 中,您将看到渲染时出现一些奇怪的行为,导致生成的图像中出现一些空白区域。当我保持接近“原始”大小时,它似乎工作得很好(在 PdfPageRenderOptions 中没有指定任何大小的情况下获得的大小,考虑到它从一个设备更改为另一个设备,这并不是真正的“原始”)。但是,如果我尝试从 PDF 渲染更大的图像,结果就是这样。
渲染: http://postimg.org/gallery/226weuga/
Surface RT 设备
- DebugOriginal_Surface.png:未缩放时所需的行为。这是我在 Surface RT 设备上得到的结果。
- DebugZoom_Surface.png:缩放时出现问题的行为。这是我在 Surface RT 设备上得到的结果。
- AnotherZoomLevel_Surface.png:进一步缩放时的另一个有问题的行为。这就是我在 上得到的信息。
任何其他设备
- DebugZoomed_DevMachine.png:缩放时所需的行为。这是我在任何 Windows 非 RT 设备上得到的结果。
- DebugOriginal_DevMachine.png:未缩放时所需的行为。这是我在任何 Windows 非 RT 设备上得到的结果。
我精简了我的代码,以确保它不是 UI 问题或我缓存 pdf 文件的方式等问题。我的代码现在非常简单,如以下示例所示:
var pdfFile = await StorageFile.GetFileFromPathAsync(NavigationService.Drawing.Path);
_pdfDoc = await PdfDocument.LoadFromFileAsync(pdfFile);
if (_pdfDoc.PageCount > 0)
{
StorageFolder folder = ApplicationData.Current.TemporaryFolder;
StorageFile pngFileOriginal = await folder.CreateFileAsync("DebugOriginal_" + Guid.NewGuid().ToString() + ".png", CreationCollisionOption.ReplaceExisting);
StorageFile pngFileZoomed = await folder.CreateFileAsync("DebugZoomed_" + Guid.NewGuid().ToString() + ".png", CreationCollisionOption.ReplaceExisting);
using (IRandomAccessStream fileStream = await pngFileOriginal.OpenAsync(FileAccessMode.ReadWrite))
{
await _pdfDoc.GetPage(0).RenderToStreamAsync(fileStream);
await fileStream.FlushAsync();
}
using (IRandomAccessStream fileStream = await pngFileZoomed.OpenAsync(FileAccessMode.ReadWrite))
{
await _pdfDoc.GetPage(0).RenderToStreamAsync(fileStream, new PdfPageRenderOptions { DestinationWidth = 2000 });
await fileStream.FlushAsync();
}
}
这是 API 的问题还是我的问题?
编辑
Microsoft 的 PDF API 示例 ( http://code.msdn.microsoft.com/windowsapps/PDF-viewer-sample-85a4bb30 ) 在 Surface 2 RT 设备上执行相同的操作。
编辑 2
该错误存在于 Surface 2 RT 上,但不存在于 Surface 1 RT 上。这显然是硬件问题。
最佳答案
这是与设备 DPI 相关的 API 的错误。降低 DPI/分辨率可以解决该问题。他们现在正在努力修复。
关于c# - Surface 2 RT 上的 Windows PDF API 渲染错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21633992/