XF skiasharp загружает поврежденный PDF

Я хочу создавать отчеты в формате 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 файлов, которые я создал, также открывается на ноутбуке. Тоже на том же пути. Я не могу понять, в чем здесь может быть проблема.

Спасибо

«В устройстве 183 КБ, а в ноутбуке 0 КБ» - похоже, проблема в передаче файла с устройства, а не в создании файла.

Jason 26.12.2020 13:38

Итак, для передачи я попытался отправить этот файл своему коллеге по скайпу. По скайпу файл не отправляется с моей стороны. Также отправил файл через Gmail себе. Я получил этот файл, размер которого на моем ноутбуке такой же, как 183 КБ, но все еще не могу открыть. :|

Gayatri Gokhale 26.12.2020 13:50

@GayatriGokhale Привет, вы могли бы проверить этот код строки vpdfCanvas.DrawText..., будет ли он вызываться.

Junior Jiang 28.12.2020 03:43

@JuniorJiang-MSFT да, это вызвано. Я могу видеть PDF на своем устройстве. проблема в том, что я не могу открыть его на своем ноутбуке. Я смущен, действительно ли он поврежден или нет. Если это так, то почему его можно открыть в устройстве?

Gayatri Gokhale 28.12.2020 06:45

@GayatriGokhale Привет, какой путь к pdf? Вы можете обновить его в вопросе.

Junior Jiang 28.12.2020 08:01

@JuniorJiang-MSFT Привет, см. правку

Gayatri Gokhale 28.12.2020 11:43

@GayatriGokhale Спасибо. Из общего пути мы видим, что это путь к внутреннему хранилищу, вы можете попробовать использовать путь к внешнему хранилищу, чтобы проверить, работает ли он.

Junior Jiang 29.12.2020 03:07

@JuniorJiang-MSFT Спасибо за вашу помощь. Но Проблема решена. Я не распорядился этим потоком должным образом. это вызывало проблему. Использование ключевого слова using помогло.

Gayatri Gokhale 30.12.2020 07:15

@двойной звуковой сигнал ооо.. Я этого не знал. Я обновлю свой ответ.

Gayatri Gokhale 30.12.2020 07:44

@GayatriGokhale Рад, что решено! Не забудьте отметить ответ, когда у вас будет время.

Junior Jiang 31.12.2020 08:25
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
Включение UTF-8 в jsPDF с помощью Angular
Включение UTF-8 в jsPDF с помощью Angular
Привет, разработчики, я предполагаю, что вы уже знаете, как экспортировать pdf через jsPDF. Если ответ отрицательный, то вы можете ознакомиться с моей...
0
10
271
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я неправильно распорядился потоком. Ключевое слово using для потока решило проблему.

Другие вопросы по теме