Я хочу создавать отчеты в формате PDF с помощью Xamarin Forms. Я попытался создать образец PDF с помощью плагина skiasharp
. Но я столкнулся со странной проблемой.
PDF можно очень легко открыть на мобильном устройстве (Android 10.0, API 29). но если я попытаюсь открыть тот же PDF-файл на ноутбуке, появится сообщение об ошибке, в котором говорится, что не удается открыть поврежденный PDF-файл.
Также, если мы посмотрим на размер PDF, он составляет 183 КБ на устройстве и 0 КБ на ноутбуке.
Код
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
Sample, доступного на github.
Любая помощь будет оценена
Редактировать
Поскольку я создал папку с именем CreatePDFSample, путь к файлу
/Internal Storage/Download/CreatePdfSample/8c134318ca8d49f59d7a57e244845107.pdf
Еще одна вещь, которую я заметил прямо сейчас: один из 10-12 файлов, которые я создал, также открывается на ноутбуке. Тоже на том же пути. Я не могу понять, в чем здесь может быть проблема.
Спасибо
Итак, для передачи я попытался отправить этот файл своему коллеге по скайпу. По скайпу файл не отправляется с моей стороны. Также отправил файл через Gmail себе. Я получил этот файл, размер которого на моем ноутбуке такой же, как 183 КБ, но все еще не могу открыть. :|
@GayatriGokhale Привет, вы могли бы проверить этот код строки vpdfCanvas.DrawText...
, будет ли он вызываться.
@JuniorJiang-MSFT да, это вызвано. Я могу видеть PDF на своем устройстве. проблема в том, что я не могу открыть его на своем ноутбуке. Я смущен, действительно ли он поврежден или нет. Если это так, то почему его можно открыть в устройстве?
@GayatriGokhale Привет, какой путь к pdf? Вы можете обновить его в вопросе.
@JuniorJiang-MSFT Привет, см. правку
@GayatriGokhale Спасибо. Из общего пути мы видим, что это путь к внутреннему хранилищу, вы можете попробовать использовать путь к внешнему хранилищу, чтобы проверить, работает ли он.
@JuniorJiang-MSFT Спасибо за вашу помощь. Но Проблема решена. Я не распорядился этим потоком должным образом. это вызывало проблему. Использование ключевого слова using
помогло.
@двойной звуковой сигнал ооо.. Я этого не знал. Я обновлю свой ответ.
@GayatriGokhale Рад, что решено! Не забудьте отметить ответ, когда у вас будет время.
Я неправильно распорядился потоком. Ключевое слово using
для потока решило проблему.
«В устройстве 183 КБ, а в ноутбуке 0 КБ» - похоже, проблема в передаче файла с устройства, а не в создании файла.