Как писать и просматривать преобразованные 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.