XF skiasharp 下载损坏的 PDF

XF skiasharp downloads corrupted PDF

我想使用 Xamarin Forms 创建 PDF 报告。我尝试使用 skiasharp 插件创建示例 PDF。但是我遇到了一个奇怪的问题。

PDF 可以在移动设备(Android 10.0, API 29) 中很容易地打开。但如果我尝试在笔记本电脑上打开相同的 PDF,则会显示错误消息 Can not open corrupted 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, 0, 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...", pageWidth / 2, pageHeight / 4, paint);
                    document.EndPage();
                }

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

                throw;
            }
        }

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

编辑

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

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

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

谢谢

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