Как писать и просматривать преобразованные PDF-файлы в и из памяти?

Прямо сейчас я использую ghostscript в Unity для преобразования pdf в jpgs и просмотра их в своем проекте.

В настоящее время это выглядит так:
-Pdfs преобразуются в несколько JPEG (по одному для каждой страницы)
Конвертированные JPEG записываются на диск
Затем они читаются байтами в 2D текстуру
-И эта 2D текстура присваивается компоненту GameObjects RawImage

Это прекрасно работает в Unity, но... (сейчас происходит сбой) мой проект предназначен для работы на Microsoft Hololens. Hololens работает на Windows 10 API, но в ограниченном объеме.

Возникает проблема, когда я пытаюсь конвертировать PDF-файлы и просматривать их на Hololens. Проще говоря, Hololens не может создавать или удалять файлы за пределами своих известных папок (Изображения, Документы и т. Д.).

Мое воображаемое решение этой проблемы состоит в том, чтобы вместо записи преобразованных файлов JPEG на диск записать их в память и просмотреть их оттуда.

В разговоре с разработчиками GhostScript мне сказали, что GhostScript.NET делает то, что я ищу, - конвертирую PDF-файлы и просматриваю их из памяти (я полагаю, это происходит с классами Rasterizer/Viewer, но, опять же, я не совсем понимаю, Что ж).

Меня заставили взглянуть на последние документы GhostScript.NET, чтобы выяснить, как это сделать, но я просто не понимаю их достаточно хорошо, чтобы приблизиться к этому.

Тогда мой вопрос, основанный на том, как я сейчас использую ghostscript, как мне использовать GhostScript.NET в моем проекте, чтобы записать преобразованные JPEG в память и просмотреть их там?

Вот как я это делаю сейчас (по кодам):

        //instantiate
        byte[] fileData;
        Texture2D tex = null;

        //if a PDF file exists at the current head path
        if (File.Exists(CurrentHeadPath))
        {
            //Transform pdf to jpg
            PdfToImage.PDFConvert pp = new PDFConvert();
            pp.OutputFormat = "jpeg"; //format
            pp.JPEGQuality = 100; //100% quality
            pp.ResolutionX = 300; //dpi
            pp.ResolutionY = 500;
            pp.OutputToMultipleFile = true;
            CurrentPDFPath = "Data/myFiles/pdfconvimg.jpg";

            //this call is what actually converts the pdf to jpeg files
            pp.Convert(CurrentHeadPath, CurrentPDFPath);

            //this just loads the first image
            if (File.Exists("Data/myFiles/pdfconvimg" + 1 + ".jpg"))
            {
                //reads in the jpeg file by bytes
                fileData = File.ReadAllBytes("Data/myFiles/pdfconvimg" + 1 + ".jpg");
                tex = new Texture2D(2, 2);
                tex.LoadImage(fileData); //..this will auto-resize the texture dimensions.

                //Read Texture into RawImage component
                PdfObject.GetComponent<RawImage>().texture = tex;
                PdfObject.GetComponent<RawImage>().rectTransform.sizeDelta = new Vector2(288, 400);
                PdfObject.GetComponent<RawImage>().enabled = true;
            }

            else
            {
                Debug.Log("reached eof");
            }
        }

Функция convert является скриптом PDFConvert, который я получил из кода проекта. В частности, Как конвертировать PDF в изображение, используя Ghostscript API.

1 ответ

Из документации GhostScript.Net взгляните на пример кода с надписью: "Использование класса GhostscriptRasterizer". В частности, следующие строки:

Image img = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
img.Save(pageFilePath, ImageFormat.Png);

Кажется, что класс Image является частью пакета System.Drawing, а System.Drawing.Image имеет другой метод Save, где первый параметр - System.IO.Stream.

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