问题描述
我想使用 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
关键字解决了这个问题。