我想使用c#、xaml将pdf文件转换为UWP中的图像UI控件。
我已经阅读了使用 Flip Viewer 的另一种方法,但我需要转换后的 PDF 文件的每个图像文件。
所以我修改了一些现有示例以打开 pdf 文件。
我的问题是转换后的图像文件的质量非常差。
我什至看不到字母。
但是这个质量问题在其他 pdf 样本上也是一样的。
看看我的代码。
private PdfDocument pdfDocument;
private async void LoadDocument()
{
pdfDocument = null;
//Output means my image UI control (pdf image will be added)
Output.Source = null;
//PageNumberBox shows current page
PageNumberBox.Text = "1";
var picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".pdf");
StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
try
{
pdfDocument = await PdfDocument.LoadFromFileAsync(file);
}
catch (Exception ex)
{
}
if (pdfDocument != null)
{ // I use this text to move page.
PageCountText.Text = pdfDocument.PageCount.ToString();
}
}
uint pageNumber;
if (!uint.TryParse(PageNumberBox.Text, out pageNumber) || (pageNumber < 1) || (pageNumber > pdfDocument.PageCount))
{
return;
}
Output.Source = null;
// Convert from 1-based page number to 0-based page index.
uint pageIndex = pageNumber-1 ;
using (PdfPage page = pdfDocument.GetPage(pageIndex))
{
var stream = new InMemoryRandomAccessStream();
await page.RenderToStreamAsync(stream);
BitmapImage src = new BitmapImage();
Output.Source = src;
await src.SetSourceAsync(stream);
}
}
这是我的 xaml 代码。
<Grid>
<ScrollViewer >
<TextBlock Name="ViewPageLabel"VerticalAlignment="center">Now page</TextBlock>
<TextBox x:Name="PageNumberBox" InputScope="Number" Width="30" Text="1" TextAlignment="Right" Margin="5,0,5,0"
AutomationProperties.LabeledBy="{Binding ElementName=ViewPageLabel}"/>
<TextBlock VerticalAlignment="Center">of <Run x:Name="PageCountText"/>.</TextBlock>
</ScrollViewer>
</Grid>
有什么建议吗?
请帮助我。
感谢您阅读本文。
最近遇到这个问题,在这里没有看到任何明确的答案,所以这里是:
JosephA 走在正确的轨道上,但 PdfPageRenderOptions 没有任何关于图像保真度/质量或类似我所希望的东西。但是,它确实允许您指定图像尺寸。您所要做的就是放大尺寸。
我怀疑发生的事情是PDF有一个它“喜欢”使用的比例,它比你想要绘制的图像小。在不指定尺寸的情况下,它会绘制“小”图像,然后放大,导致模糊。
相反,如果你明确告诉它以更高分辨率绘制图像,它会执行 PDF 魔法使这些线条更清晰,并且生成的光栅图像不必缩放/模糊。
PdfPage page = _document.GetPage(pageIndex);
await page.RenderToStreamAsync(stream, new PdfPageRenderOptions {
DestinationWidth = (uint)page.Dimensions.MediaBox.Width * s,
DestinationHeight = (uint)page.Dimensions.MediaBox.Height * s
});
这样的东西会有所帮助,其中“s”是达到您需要的尺寸的比例因子。 PdfPage.Dimensions 除了“MediaBox”之外还有许多不同的属性,您可能还想根据您的用例进行探索。
听起来您遇到了常见问题,您需要动态调整 PDF 页面渲染到图像的分辨率。
我不熟悉该 PDF 库,但似乎您需要使用 RenderToStreamAsync() 重载,该重载需要 PdfPageRenderOptions 参数来完成此操作。
我也遇到了同样的问题 解决办法如下:
ApplicationLanguages.PrimaryLanguageOverride = CultureInfo.InvariantCulture.TwoLetterISOLanguageName;
//Get the page from the PDF document with a given index
var pdfPage = pdfDocument.GetPage(uint.Parse(i.ToString()));
await pdfPage.PreparePageAsync();
double pdfPagePreferredZoom = 2;// pdfPage.PreferredZoom /** m_pdfViewer.PrinterSettings.QualityFactor*/;
IRandomAccessStream randomStream = new InMemoryRandomAccessStream();
global::Windows.Data.Pdf.PdfPageRenderOptions pdfPageRenderOptions = new global::Windows.Data.Pdf.PdfPageRenderOptions();
var pdfPageSize = pdfPage.Size;
//Set the height to which the page is to be printed
pdfPageRenderOptions.DestinationHeight = (uint)(pdfPage.Dimensions.MediaBox.Height * pdfPagePreferredZoom); // /*(uint)(pdfPageSize.Height * pdfPagePreferredZoom);*/ (uint)(pdfPageSize.FromNative().Height * pdfPagePreferredZoom);
//Set the width to which the page is to be printed
pdfPageRenderOptions.DestinationWidth = (uint)(pdfPage.Dimensions.MediaBox.Width * pdfPagePreferredZoom); ///*(uint)(pdfPageSize.Width * pdfPagePreferredZoom); */(uint)(pdfPageSize.FromNative().Width * pdfPagePreferredZoom);
await pdfPage.RenderToStreamAsync(randomStream, pdfPageRenderOptions);
//Create a new Image to which the page will be rendered
imageCtrl = new Windows.UI.Xaml.Controls.Image();
BitmapImage src = new BitmapImage();
randomStream.Seek(0);
//Obtain image source from the randomstream
src.SetSource(randomStream);
//set the image source to the image
imageCtrl.Source = src;
var DisplayInformation = Windows.Graphics.Display.DisplayInformation.GetForCurrentView();
var dpi = DisplayInformation.LogicalDpi / 96;
imageCtrl.Height = (src.PixelHeight / dpi)/2;
imageCtrl.Width = (src.PixelWidth / dpi)/2;
randomStream.Dispose();
pdfPage.Dispose();
printDocument.AddPage(imageCtrl);
区别在于我将首选缩放加倍,并将宽度和高度潜水了 2。