Я создаю приложение для визуализации некоторых экспериментальных данных (x, y графики с несколькими сериями), где основная цель заключается в создании PDF-файла, который соответствует правилам научной публикации. Генерация PDF работает хорошо, и я также могу отобразить PDF в PdfKit PdfView. Однако, когда я пытаюсь показать большие файлы PDF в приложении (ряд данных с большим количеством точек (как в 20000)), некоторый фоновый поток потратит минуты (3-4) на генерацию какой-то кешированной версии, которую PdfView использует дляболее быстрое рендеринг с увеличением.
Я могу обойти эту проблему, установив PdfView.Document в виде пустого документа PDF, а затем добавив страницу. PdfView будет кешировать пустую страницу, но я не буду тратить минуты на 100% загрузку процессора, пытаясь сгенерировать кэшированную версию. Однако это породило еще одну проблему: если кэшированная версия отсутствует, операция масштабирования будет менее приятной, чем требуется.
Кроме того, у меня есть несколько ползунков, которые влияют на результат в формате PDF и требуют очень быстрых обновлений. из отображенного PDF.
Есть ли лучший способ отображения PDF-файлов (данных)? Было бы лучше, если бы метод позволял увеличивать масштаб документа.
Очень медленно для больших PDF-файлов:
PDFPlotView.Document = pdf;
Быстрая, но не кэшированная версия:
PDFPlotView.Document = new PdfDocument();
PDFPlotView.Document.InsertPage(pdf.GetPage(0), 0);
Я также попытался сгенерировать изображение с низким разрешением изpdf, а затем пытается использовать это изображение для генерации кэша, но, похоже, существует известная ошибка, из-за которой pdf становится пустым:
using (var context = new CGBitmapContext(null, (int)rect.Width, (int)rect.Height, 8, 0, CGColorSpace.CreateDeviceRGB(), CGBitmapFlags.NoneSkipLast)
{
InterpolationQuality = CGInterpolationQuality.None
})
{
context.SetFillColor(new CGColor(1, 1, 1, 1));
context.FillRect(rect);
context.ScaleCTM(1, 1);
context.DrawPDFPage(pdf.Document.GetPage(0));
img = context.ToImage();
}
PdfDocument lowrespdf = new PdfDocument();
NSImage cache = new NSImage(img, rect.Size);
PdfPage page = new PdfPage(cache);
lowrespdf.InsertPage(page, 0);
[ОБНОВЛЕНИЕ] Проблема производительности, по-видимому, связана не с количеством точек данных, а с длиной одного пути в файле PDF. Разделение проблемного ряда данных по новым строкам на каждую 1000 точек данных приводит к увеличению времени кеширования в несколько секунд (макс.) По сравнению с несколькими минутами для линии точек данных 25000.