RGB 565 PDF для изображения - PullRequest
       4

RGB 565 PDF для изображения

1 голос
/ 24 февраля 2020

Я пытаюсь преобразовать страницу PDF в изображение, чтобы создать миниатюры. Это код, который я использую:

PdfRenderer pdfRenderer = new PdfRenderer(GetSeekableFileDescriptor(filePath));

var appDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
string directoryPath = System.IO.Path.Combine(appDirectory, "thumbnailsTemp", System.IO.Path.GetFileNameWithoutExtension(fileName));

if (!Directory.Exists(directoryPath))
{
    Directory.CreateDirectory(directoryPath);

    int pageCount = pdfRenderer.PageCount;

    for (int i = 0; i < pageCount; i++)
    {
        Page page = pdfRenderer.OpenPage(i);
        Android.Graphics.Bitmap bmp = Android.Graphics.Bitmap.CreateBitmap(page.Width, page.Height, Android.Graphics.Bitmap.Config.Rgb565 or Argb8888);
        page.Render(bmp, null, null, PdfRenderMode.ForDisplay);

        try
        {
            using (FileStream output = new FileStream(System.IO.Path.Combine(directoryPath, fileName + "Thumbnails" + i + ".png"), FileMode.Create))
            {
                bmp.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 100, output);
            }

            page.Close();
        }
        catch (Exception ex)
        {
            //TODO -- GERER CETTE EXPEXPTION
            throw new Exception();
        }
    }

    return directoryPath;
}

Я пробовал с ARGB 8888, и это было успешно. Но время рендеринга было слишком медленным для больших файлов PDF. Вот почему я попытался улучшить его, изменив формат на RGB 565. Но мое приложение не работает с этим исключением:

Неподдерживаемый формат пикселей

Есть идеи, чтобы это исправить, или как сделать PDF-файл в растровом формате быстрее? Я искал в Google, но не нашел решения, связанного с моим кодом.

ОБНОВЛЕНИЕ

Я сделал это, но знаю, мое приложение сбой в этой строке кода:

await Task.Run(() =>
            {
                bytes = page.AsPNG(72);
            });

Мой класс:

public async Task<string> GetBitmaps(string filePath)
    {

        //TODO -- WORK ON THIS
        PdfRenderer pdfRenderer = new PdfRenderer(GetSeekableFileDescriptor(filePath));

        var appDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
        string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
        string directoryPath = System.IO.Path.Combine(appDirectory, "thumbnailsTemp", System.IO.Path.GetFileNameWithoutExtension(fileName));

        var stream = new MemoryStream();

        using (Stream resourceStream = new FileStream(filePath, FileMode.Open))
        {
            resourceStream.CopyTo(stream);
        }

        for (int i = 0; i < pdfRenderer.PageCount; i++)
        {
            TallComponents.PDF.Rasterizer.Page page = new TallComponents.PDF.Rasterizer.Page(stream, i);

            byte[] bytes = null;
            await Task.Run(() =>
            {
                bytes = page.AsPNG(72);
            });

            using (FileStream output = new FileStream(System.IO.Path.Combine(directoryPath, fileName + "Thumbnails" + i + ".png"), FileMode.Create, FileAccess.Write))
            {
                output.Write(bytes, 0, bytes.Length);
            }
        }

        return directoryPath;
    }

1 Ответ

1 голос
/ 25 февраля 2020

Вы можете нарисовать страницу PDF в приложении, преобразовав страницу PDF в растровое изображение, здесь сам документ PDF встроен как ресурс.

var assembly = Assembly.GetExecutingAssembly();
var stream = new MemoryStream();
using (Stream resourceStream = assembly.GetManifestResourceStream("DrawPdf.Android.tiger.pdf"))
{
  resourceStream.CopyTo(stream);
}
Page page = new Page(stream, 0);

// render PDF Page object to a Bitmap
byte[] bytes = null;
await Task.Run(() =>
{
   bytes = page.AsPNG(72);
});
Bitmap bmp = global::Android.Graphics.BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length);
...