/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PdfEncoder.Infrastructure/Pdf/PdfPageRenderer.cs
71 строка
2 KB
IBS\NAfanasev
DocumentContext local functional
01 июл 2026, 15:30
01 июл 2026, 15:30
b4038c9
Код
Авторство
О чём код?
using Docnet.Core.Models; using PdfEncoder.Application.Abstractions; using UglyToad.PdfPig; namespace PdfEncoder.Infrastructure.Pdf; /// <summary> /// Рендер страниц PDF через Docnet. /// </summary> public sealed class PdfPageRenderer(IDocLibProvider docLibProvider) : IPdfPageRenderer { /// <inheritdoc /> public Task<RenderedPageImage> RenderPageAsync( ReadOnlyMemory<byte> content, int pageIndex, int dpi, CancellationToken ct) { ct.ThrowIfCancellationRequested(); var dimensions = ResolvePageDimensions(content, pageIndex, dpi); using var reader = docLibProvider.Instance.GetDocReader(content.ToArray(), dimensions); using var pageReader = reader.GetPageReader(pageIndex); var width = pageReader.GetPageWidth(); var height = pageReader.GetPageHeight(); var bgra = pageReader.GetImage(); var grayscale = ConvertBgraToGrayscale(bgra); return Task.FromResult(new RenderedPageImage { GrayscaleBytes = grayscale, Width = width, Height = height }); } private static PageDimensions ResolvePageDimensions( ReadOnlyMemory<byte> content, int pageIndex, int dpi) { using var document = PdfDocument.Open(content); var pageNumber = pageIndex + 1; if (pageNumber < 1 || pageNumber > document.NumberOfPages) { return new PageDimensions(1700, 2200); } var page = document.GetPage(pageNumber); var widthPx = Math.Max(1, (int)Math.Round(page.Width / 72d * dpi)); var heightPx = Math.Max(1, (int)Math.Round(page.Height / 72d * dpi)); return new PageDimensions(widthPx, heightPx); } private static byte[] ConvertBgraToGrayscale(byte[] bgra) { var pixelCount = bgra.Length / 4; var grayscale = new byte[pixelCount]; for (var i = 0; i < pixelCount; i++) { var offset = i * 4; var b = bgra[offset]; var g = bgra[offset + 1]; var r = bgra[offset + 2]; grayscale[i] = (byte)((r * 299 + g * 587 + b * 114) / 1000); } return grayscale; } }