XF skiasharp 下载损坏的 PDF

问题描述

我想使用 Xamarin Forms 创建 PDF 报告。我曾尝试使用 skiasharp 插件创建示例 PDF。但我面临着奇怪的问题。

PDF 可以很容易地在移动设备(Android 10.0,API 29)中打开。但是,如果我尝试在笔记本电脑中打开相同的 PDF,则会显示错误消息,指出无法打开损坏的 PDF

此外,如果我们查看 PDF 的大小,它在设备中为 183 KB,在笔记本电脑中为 0KB。

代码

private void GenerateDocument()
        {
            try
            {
                var root = EnsureTempDataDirectory("CreatePdfSample");
                path = Path.Combine(root,$"{Guid.NewGuid():N}.pdf");
                
                if (!isSupported || (isSupported && File.Exists(path)))
                    return;

                var Metadata = new SKDocumentPdfMetadata
                {
                    Author = "Cool Developer",Creation = DateTime.Now,Creator = "Cool Developer Library",Keywords = "SkiaSharp,Sample,PDF,Developer,Library",Modified = DateTime.Now,Producer = "SkiaSharp",Subject = "SkiaSharp Sample PDF",Title = "Sample PDF",};

                var stream = SKFileWStream.OpenStream(path);
                var document = SKDocument.CreatePdf(path,Metadata);

                if (document == null)
                {
                    isSupported = false;
                    return;
                }

                var paint = new SKPaint
                {
                    TextSize = 64.0f,IsAntialias = true,Color = 0xFF9CAFB7,Isstroke = true,strokeWidth = 3,TextAlign = SKTextAlign.Center
                };

                var pageWidth = 840;
                var pageHeight = 1188;

                // draw page 1
                using (var pdfCanvas = document.BeginPage(pageWidth,pageHeight))
                {
                    // draw button
                    var nextPagePaint = new SKPaint
                    {
                        IsAntialias = true,TextSize = 16,Color = SKColors.OrangeRed
                    };
                    var nextText = "Next Page >>";
                    var btn = new SKRect(pageWidth - nextPagePaint.MeasureText(nextText) - 24,pageWidth,nextPagePaint.TextSize + 24);
                    pdfCanvas.DrawText(nextText,btn.Left + 12,btn.Bottom - 12,nextPagePaint);
                    // make button link
                    pdfCanvas.DrawLinkDestinationAnnotation(btn,"next-page");

                    // draw contents
                    pdfCanvas.DrawText("...PDF 1/2...",pageWidth / 2,pageHeight / 4,paint);
                    document.EndPage();
                }

                // draw page 2
                using (var pdfCanvas = document.BeginPage(pageWidth,pageHeight))
                {
                    // draw link destintion
                    pdfCanvas.DrawNamedDestinationAnnotation(SKPoint.Empty,"next-page");

                    // draw contents
                    pdfCanvas.DrawText("...PDF 2/2...",paint);
                    document.EndPage();
                }

                // end the doc
                document.Close();
            }
            catch (Exception ex)
            {

                throw;
            }
        }

对于示例,我参考了 github 上的 Skiasharp 示例。 任何帮助将不胜感激

编辑

因为我已经创建了名为 CreatePDFSample 的文件夹,所以文件的路径是

/Internal Storage/Download/CreatePdfSample/8c134318ca8d49f59d7a57e244845107.pdf

我现在注意到的另一件事,我创建的 10-12 个文件之一也在笔记本电脑中打开。它也在同一条路上。我不明白这里可能有什么问题。

谢谢

解决方法

我没有正确处理流。流的 using 关键字解决了这个问题。