PDFsharp: возможности, ограничения, версии и применение в.NET-проектах
PDFsharp занимает необычное место среди инструментов для PDF: это не программа с окном редактора и не просмотрщик документов, а библиотека для разработчиков .NET. Её подключают к собственному приложению, сервису, веб-бэкенду или утилите, после чего код может создавать PDF, добавлять графику и текст, собирать и разделять страницы, читать структуру существующих файлов, шифровать документы и выполнять ряд других операций. Поэтому оценивать PDFsharp по тем же критериям, что Adobe Acrobat или Sumatra PDF, неправильно: здесь удобство определяется API, совместимостью сборок и предсказуемостью результата, а не меню и панелями инструментов.
| Параметр | Актуальное состояние |
|---|---|
| Тип | Open-source .NET-библиотека для создания и обработки PDF |
| Разработчик | empira Software GmbH и PDFsharp Team |
| Стабильная версия | 6.2.4, опубликована 6 января 2026 года |
| Предварительная ветка | 7.0.0-preview-1, опубликована 24 марта 2026 года |
| Основные пакеты | PDFsharp Core, PDFsharp-GDI, PDFsharp-WPF; отдельно доступны пакеты с MigraDoc |
| Платформы | Core — платформы, поддерживаемые совместимым .NET; GDI/WPF — только Windows |
| Лицензия | MIT, без роялти и обязательной коммерческой подписки |
| Основной формат | PDF; изображения используются как входные ресурсы при формировании страниц |
| Интерфейс | Программный API, отдельного настольного GUI нет |
| Облако и аккаунт | Для работы библиотеки не требуются облачный сервис PDFsharp и пользовательская учётная запись |
Скачать PDFsharp
Новейшая версия для Виндовс, macOS и Линукс. Удобный редактор PDF под российские реалии.
Для прикладного проекта наиболее безопасный путь получения PDFsharp — официальный пакет NuGet, опубликованный владельцем PDFsharp-Team. На дату подготовки обзора стабильной является версия 6.2.4. На NuGet одновременно доступна 7.0.0-preview-1, но она помечена как prerelease. Документация проекта прямо рекомендует использовать актуальную стабильную версию в производственном коде и заранее проверять совместимость с Preview-ветками, чтобы обнаруживать будущие изменения API.
Выбор пакета зависит не от «редакции» в пользовательском смысле, а от платформы приложения. Пакет PDFsharp без суффикса — Core-сборка, не зависящая от GDI+ или WPF и предназначенная для кроссплатформенных сценариев. PDFsharp-GDI и PDFsharp-WPF используют компоненты Windows, зато получают более широкую поддержку форматов изображений и более естественную работу с установленными в Windows шрифтами. Пакеты PDFsharp-MigraDoc объединяют PDFsharp с отдельной библиотекой MigraDoc для высокоуровневой верстки документов; это не «полная версия PDFsharp», а другая комбинация библиотек.
Старые PDFsharp 1.5 и сторонний PdfSharpCore нельзя считать взаимозаменяемыми с актуальной PDFsharp 6/7. PDFsharp 1.5 остаётся исторической веткой на .NET Framework и больше не поддерживается. PdfSharpCore — отдельный порт более старого PDFsharp со своими пространствами имён и зависимостями для шрифтов и изображений. При миграции с него официальная документация требует учитывать различия API, а не просто менять номер пакета.
Что такое PDFsharp
PDFsharp Library — библиотека на C# для программной обработки PDF. Название PDFsharp одновременно употребляется для самой библиотеки и более широкого PDFsharp Project, куда входит также MigraDoc. Разработку и публикацию ведёт empira Software GmbH вместе с PDFsharp Team; проект активно поддерживается, а основная документация охватывает современные ветки 6.x и 7.0 Preview.
Главная модель PDFsharp низкоуровневая: приложение создаёт объект PDF-документа, добавляет страницы, получает графический контекст XGraphics и рисует текст, линии, формы и изображения. Такой подход удобен, когда координаты и состав страницы определяет программа: счета, билеты, сертификаты, штриховые формы, водяные знаки, штампы, отчёты с фиксированным макетом. При этом PDFsharp не является текстовым процессором: базовая раскладка текста есть, но автоматические переносы сложных документов и разбиение содержимого по страницам не являются её основной задачей. Для абзацев, таблиц, стилей, колонтитулов и автоматического потока разработчики проекта предлагают MigraDoc.
PDFsharp также открывает существующие PDF, импортирует страницы, объединяет и разделяет документы и дописывает новое графическое содержимое. Но высокоуровневого API «найти слово и заменить его, сохранив верстку» нет: извлечение текста доступно лишь на низком уровне без автоматического восстановления абзацев и логической структуры.
Ещё одна принципиальная граница — отсутствие PDF-рендера. PDFsharp не отображает готовые PDF-страницы, не печатает их собственным движком и не конвертирует страницу в PNG. В составе есть preview-контроль для визуализации операций XGraphics, но он не превращает библиотеку в просмотрщик. Для чтения созданного файла конечному пользователю всё равно нужен внешний viewer.
Хронология развития и поддержки
Современная линия проекта начинается с PDFsharp 6.0, выпущенной в ноябре 2023 года. В ней Core-сборка была перенесена на современный .NET и стала работать не только в Windows, но и на Linux и macOS; одновременно обновили криптографические возможности и убрали старую зависимость SharpZipLib для потокового сжатия. PDFsharp 6.1 добавила мульти-таргетинг с .NET Standard и вернула возможность использовать библиотеку в совместимых проектах .NET Framework.
В ветке 6.2 проект расширил чтение проблемных PDF, добавил цифровые подписи, развивал PDF/A, улучшил работу с потоками, изображениями, шифрованием и объектными потоками. Версии 6.2.1–6.2.4 в основном дорабатывали совместимость и исправляли крайние случаи. В 6.2.4, например, исправлены отдельные JPEG JFIF, косвенный DecodeParms и совместимость некоторых зашифрованных документов с просмотрщиком Edge.
6.2.4 остаётся стабильным выпуском. В марте 2026 года появился PDFsharp 7.0.0 Preview 1: эта ветка ориентирована на дальнейшую переработку объектной модели, стабильность и расширяемость, но содержит breaking changes и требует перекомпиляции кода, рассчитанного на 6.x. Поэтому версия 7 в этом обзоре рассматривается как тестовая линия, а не как замена стабильной 6.2.4 в производстве.
Основные функции PDFsharp
Создание PDF и рисование содержимого
Базовый сценарий PDFsharp — создание документа «с нуля». Приложение добавляет страницу нужного размера и ориентации, получает XGraphics и размещает элементы по координатам. Поддерживаются линии, дуги, сплайны, прямоугольники, скруглённые прямоугольники, эллипсы, многоугольники, пути, заливки, обрезка, матричные преобразования и градиенты. Цвета могут задаваться в RGB, CMYK и градациях серого, включая прозрачность.
Для текста используются TrueType и OpenType-шрифты с TrueType-контурами. Шрифты можно встраивать и подмножественно включать в PDF, оставляя только реально использованные глифы; это помогает снижать размер файлов. PostScript-шрифты библиотека не поддерживает. В кроссплатформенной Core-сборке управление шрифтами требует особого внимания: встроенный resolver на части платформ находит системные гарнитуры, но для переносимого production-приложения документация рекомендует собственный IFontResolver, который гарантированно поставляет нужные файлы шрифтов.
Изображения и шаблоны
В PDF можно помещать растровые изображения и использовать PDF Form XObject как повторно применяемый графический объект. Core нативно работает с JPEG, PNG и Windows BMP. GDI/WPF на Windows используют системные графические библиотеки и дополнительно поддерживают GIF и TIFF, а также больше вариантов уже перечисленных форматов. Прозрачность изображений, маски и альфа-каналы входят в заявленные возможности.
Объединение, разделение и перенос страниц
Существующий PDF можно открыть в режиме импорта, создать новый документ и добавлять в него выбранные страницы. На этой модели строятся типовые операции merge, split, перестановка и формирование выборки страниц. Такой подход сохраняет страницу как PDF-объект, а не растрирует её, поэтому он подходит для серверной пакетной обработки без печати через виртуальный принтер.
Важно отличать перенос страницы от редактирования её исходного текста. PDFsharp умеет создать поверх существующей страницы новый графический слой или добавить объекты документа, но не предлагает высокоуровневого текстового редактора содержимого. Если задача звучит как «исправить фамилию внутри уже свёрстанного договора», библиотека не даёт универсального безопасного API для такого действия.
Шифрование, ограничения доступа и подписи
PDFsharp читает и создаёт защищённые PDF, поддерживает пользовательский и owner-пароль и флаги разрешений на печать, изменение, аннотации и другие действия. По умолчанию для нового защищённого документа используется AES-128 в схеме PDF encryption version 4. Также доступно AES-256 для PDF 2.0. Устаревшие RC4-варианты оставлены ради совместимости, но документация не рекомендует их для новых документов.
Начиная с 6.2 библиотека поддерживает цифровые подписи на основе CMS. Встроенный PdfSharpDefaultSigner работает с X509Certificate2; при необходимости можно реализовать собственный IDigitalSigner, например для аппаратного устройства. Поддерживается и timestamping, однако подключение сервера отметки времени уже является внешней сетевой зависимостью конкретного приложения, а не обязательным сервисом PDFsharp.
PDF/A, PDF/UA и специальные возможности PDF
В PDFsharp есть API для создания новых PDF/A-документов, но официальная документация прямо называет эту поддержку ранней и незавершённой. Библиотека не конвертирует произвольный существующий PDF в PDF/A, не гарантирует соответствие импортированного внешнего объекта и не выполняет проверку уже существующего файла на соответствие стандарту. Поэтому архивный workflow должен включать отдельный валидатор.
Метаданные, аннотации и объектная модель
Интерфейс и удобство использования
У PDFsharp нет отдельного пользовательского интерфейса: рабочая среда — IDE и код проекта. NuGet задаёт вариант Core, GDI или WPF; PdfSharp.Pdf отвечает за документы и страницы, а PdfSharp.Drawing и XGraphics — за визуальное содержимое. Для диагностики доступны исключения и логирование.
API предсказуем для разработчика, знакомого с System.Drawing: страница воспринимается как холст, а большинство операций задаются координатами. Это снижает порог для фиксированного макета, но повышает стоимость сложной верстки. В PDFsharp не нужно осваивать визуальный дизайнер, зато приходится самостоятельно рассчитывать размеры блоков, перенос строк и переходы на новую страницу, если задача выходит за пределы простого TextFormatter.
Для длинных документов удобнее не наращивать собственный движок разметки поверх XGraphics, а использовать MigraDoc. Он строит документ из абзацев, таблиц, стилей, колонтитулов и секций, автоматически рассчитывает страницы и затем рендерит в PDF через PDFsharp. Это важное разделение ответственности: PDFsharp лучше контролирует низкий уровень страницы, MigraDoc — потоковый макет.
Поддерживаемые форматы и совместимость
PDFsharp работает прежде всего с PDF и не позиционируется как универсальный конвертер офисных форматов. Согласно FAQ, библиотека создаёт PDF версий 1.4–1.7 и 2.0. При этом она не записывает object streams; если открыть файл, активно использующий такие потоки, и затем пересохранить его, размер может вырасти. Это принципиальное ограничение для сценария «прочитать и просто сохранить без изменений» — байтовая идентичность и исходная оптимизация не гарантируются.
| Тип данных | Core | GDI/WPF | Комментарий |
|---|---|---|---|
| Чтение/создание/структурная обработка | То же | Не является движком просмотра или рендеринга страниц | |
| JPEG | Да | Да | Windows-сборки принимают больше вариантов кодирования |
| PNG | Да | Да | Поддержка прозрачности зависит от конкретного изображения и декодера |
| BMP | Windows BMP | Да | Подходит как промежуточный формат для Core |
| GIF | Нет | Да | Доступен через Windows-графику |
| TIFF | Нет | Да | Доступен через Windows-графику |
| TrueType / OpenType TT | Да | Да | Шрифт должен быть доступен resolver-у |
| PostScript fonts | Нет | Нет | Официальный FAQ исключает их поддержку |
Core рассчитан на Windows, Linux, macOS и другие платформы, на которых доступен совместимый .NET. Он подходит ASP.NET, сервисам, контейнерам и другим headless-сценариям. GDI/WPF — Windows-only варианты. Если проект переносится с PDFsharp 1.5, следует учитывать, что прежний пакет без суффикса зависел от GDI для части функций; в 6.x Core полностью избавлен от Windows-зависимостей, поэтому поведение шрифтов и изображений может отличаться.
Сторонний PdfSharpCore также не является «Linux-версией официального PDFsharp». Он возник как порт старой кодовой базы и использует SixLabors.Fonts и ImageSharp. Современный официальный PDFsharp Core уже кроссплатформенный, а переход с PdfSharpCore требует смены namespace и адаптации частей кода, связанных с XImage и шрифтами.
Производительность и стабильность
У проекта нет одного универсального официального теста, из которого можно вывести скорость для любого PDF, поэтому обещать конкретное время обработки нельзя. Производительность зависит от количества страниц и объектов, объёма изображений, шрифтов, шифрования и того, создаётся ли документ с нуля или разбирается существующая сложная структура. Полезнее ориентироваться на подтверждённые инженерные изменения.
С версии 6.1 PDFsharp использует 64-битные размеры и смещения и может читать и записывать PDF больше 2 ГиБ; документация указывает теоретический предел около 10 ГБ, определяемый форматом десятизначных смещений в классической xref-таблице. Это не означает, что любой десятгигабайтный файл будет экономно обрабатываться на машине с небольшим объёмом RAM: предел формата и реальное потребление памяти — разные параметры, поэтому крупные prepress-файлы нужно профилировать на реальной нагрузке.
Парсер постепенно становится терпимее к некорректным PDF: 6.2 улучшила чтение ряда проблемных файлов, а 6.2.4 исправила редкие JFIF и DecodeParms. Но остаются документы, которые открываются в популярных viewer и не разбираются PDFsharp, поэтому критический конвейер должен иметь регрессионный набор реальных входных файлов.
Лицензирование и версии
PDFsharp распространяется по MIT License. Это разрешительная open-source лицензия: библиотеку можно использовать, изменять, включать в коммерческие и закрытые приложения, распространять в составе продукта и не платить роялти. Официальный FAQ отдельно подтверждает коммерческое использование и отсутствие обязательства переводить собственный проект на open-source лицензию.
Платной «Pro-редакции» библиотеки, которая открывает скрытые базовые функции PDFsharp, нет. Отдельно существуют коммерческие услуги и решения экосистемы разработчика, но они не превращают MIT-пакет PDFsharp 6.2.4 в trial. Для самого пакета нет срока пробного режима, водяного знака, ограничения числа страниц, обязательной регистрации или активации.
Карта критических зависимостей
| Зависимость | Когда нужна | Риск | Практический контроль |
|---|---|---|---|
| .NET runtime / SDK | Всегда для приложения или сборки | Несовместимый target framework | Фиксировать TFM и версию SDK в CI |
| NuGet | Обычно при restore | Недоступный источник пакетов | Использовать lock и корпоративный cache/feed при необходимости |
| Шрифты | При выводе текста | Подмена гарнитуры или сбой на сервере | Поставлять разрешённые файлы шрифтов через свой FontResolver |
| GDI/WPF | Только Windows-сборки | Привязка к Windows | Выбирать Core для кроссплатформенного проекта |
| Внешний PDF-viewer | Для визуальной проверки и чтения | Различия отображения | Проверять минимум в целевом viewer и одном независимом |
| Сертификат и TSA | Для цифровой подписи/временной метки | Истечение, недоступность ключа или сервера времени | Мониторить срок сертификата и отдельно тестировать timestamping |
| Внешний валидатор | Для строгого PDF/A или PDF/UA | Ложное ощущение соответствия | Включить проверку результата в pipeline |
Сам PDFsharp не требует Adobe Acrobat, облачного аккаунта или собственного сервера разработчика для выполнения локальных операций. Но воспроизводимый production-конвейер почти всегда зависит от среды .NET и шрифтов. Именно шрифты становятся частой скрытой причиной различий между ноутбуком разработчика, Linux-контейнером и Windows-сервером.
Системные требования
Core
Пакет PDFsharp 6.2.4 публикует целевые сборки для net8.0, net9.0, net10.0 и netstandard2.0. Официальное объявление выпуска отмечает, что Core должен работать на совместимых платформах, включая Windows и Linux; документация также рассматривает macOS, ASP.NET, Blazor и MAUI как возможные среды современного Core. Для нового проекта логично выбирать поддерживаемую версию .NET, а netstandard2.0 использовать прежде всего там, где требуется совместимость со старой экосистемой.
GDI и WPF
PDFsharp-GDI и PDFsharp-WPF 6.2.4 предназначены только для Windows. NuGet-пакеты таргетируют net8.0-windows, net9.0-windows, net10.0-windows и net462. Их преимущество — интеграция с Windows-графикой, доступ к установленным шрифтам и более широкий набор декодируемых изображений. На сервере доступ к папке системных шрифтов всё равно может быть ограничен, поэтому собственный resolver остаётся надёжным вариантом.
Сборка исходников
Преимущества и недостатки PDFsharp
Плюсы и минусы
• Разрешительная MIT-лицензия. Подходит и для закрытых коммерческих приложений без роялти и обязательного раскрытия собственного кода.
• Кроссплатформенный Core. Один API можно использовать в Windows, Linux, macOS и серверных .NET-сценариях, если правильно решить вопрос шрифтов.
• Хороший низкоуровневый контроль. Программа явно задаёт страницы, координаты, графические элементы, метаданные, защиту и структуру.
• Работа с существующими PDF. Импорт страниц, merge/split и добавление собственного содержимого позволяют автоматизировать типовые документообороты без GUI.
• Современная криптография. Есть AES-128, AES-256 для PDF 2.0 и цифровые CMS-подписи.
• Активная ветка разработки. В 2025–2026 годах выходили стабильные исправления 6.2.x и началась Preview-ветка 7.
Минусы
• Нет рендеринга PDF. Библиотека не заменяет просмотрщик и не выдаёт изображения страниц своим движком.
• Нет полноценного редактирования существующего текста. Доступ к content stream не равен высокоуровневому редактору слов, абзацев и шрифтов.
• Базовая верстка текста. Для сложных многостраничных документов приходится подключать MigraDoc или писать собственную логику layout.
• Core требует дисциплины со шрифтами. Без собственного FontResolver результат может зависеть от окружения.
• Различия форматов изображений между сборками. GIF/TIFF и часть Windows-графики недоступны в чистом Core.
• PDF/A ещё незрелый. Нельзя считать библиотеку универсальным конвертером или валидатором архивных PDF.
• Пересохранение может увеличить файл. PDFsharp не пишет object streams, поэтому оптимизированный входной PDF иногда становится крупнее.
Сравнение с аналогами
| Инструмент | Основная роль | Сильная сторона | Лицензирование | Когда предпочесть |
|---|---|---|---|---|
| PDFsharp | .NET SDK для создания и структурной обработки PDF | Низкоуровневое рисование, merge/split, MIT, три сборки | MIT | Когда нужен встраиваемый PDF-компонент без copyleft и без GUI |
| iText Core 9 | Java/.NET PDF SDK | Широкая корпоративная PDF-функциональность и экосистема | AGPLv3 или коммерческая лицензия | Когда функции iText оправдывают более сложную лицензионную модель |
| QuestPDF | .NET-генератор документов | Высокоуровневый fluent layout для новых PDF | Community/Professional/Enterprise; Community не является OSI-лицензией | Когда главное — удобная автоматическая верстка нового документа |
| PdfPig | .NET-библиотека чтения и анализа PDF | Извлечение текста, координат, изображений и layout-анализ | Apache-2.0 | Когда приоритет — разбор содержимого, а не рисование и модификация |
| Sumatra PDF | Настольный просмотрщик для Windows | Быстрое чтение PDF и других форматов | Open source | Когда документ нужно открыть человеку, а не сгенерировать кодом |
iText ближе всего к PDFsharp по роли SDK, но его dual-license модель принципиально отличается: бесплатное использование iText Core связано с требованиями AGPL, а закрытым проектам обычно нужна коммерческая лицензия. PDFsharp проще для компании, которой достаточно его функциональности и важно оставить собственный код закрытым без отдельного договора на библиотеку.
Sumatra PDF сравнивать с PDFsharp нужно только по роли в цепочке: PDFsharp создаёт или преобразует файл внутри приложения, а Sumatra PDF открывает готовый документ пользователю. Если нужен именно просмотр, разумнее выбрать viewer, например Sumatra PDF или Adobe Acrobat Reader. Если нужна ручная правка страниц и аннотаций, ближе PDF-XChange Editor. Для визуальной склейки и разрезания без программирования проще PDFsam Basic, для OCR — ABBYY FineReader, а для подготовки офисного документа с последующим экспортом можно рассмотреть LibreOffice.
Инструкция по установке
Установка стабильной Core-сборки через NuGet
1. Установите поддерживаемый .NET SDK и откройте существующий проект либо создайте новый проект с подходящим target framework.
2. Для кроссплатформенного приложения выберите пакет PDFsharp версии 6.2.4. В Visual Studio его можно добавить через NuGet Package Manager; в CLI для .NET 9 и более ранних SDK применяется команда dotnet add package PDFsharp —version 6.2.4. В .NET 10 доступен новый порядок dotnet package add PDFsharp —version 6.2.4.
3. Выполните restore/build. NuGet добавит PackageReference и подтянет необходимые зависимости; отдельный установщик PDFsharp в Windows не запускается.
4. Добавьте минимальный тест: создайте PdfDocument, страницу и XGraphics, нарисуйте короткую строку и сохраните файл во временный каталог. Для Core заранее настройте FontResolver, если используемый шрифт не гарантирован окружением.
5. Откройте полученный PDF во внешнем просмотрщике и проверьте текст, размер страницы и наличие встроенного шрифта. Это и есть практический «первый запуск»: самостоятельного GUI у PDFsharp нет.
Параметры, которые важно настроить сразу
• Версия пакета. Зафиксируйте 6.2.4 или другую сознательно выбранную версию в проекте и lock-файле, если воспроизводимость сборок критична.
• FontResolver. В Core определите, откуда берутся все используемые шрифты, и проверьте лицензию на их распространение.
• Режим записи. Для production используйте компактную запись PDF, а verbose оставляйте для диагностики.
• Культура и единицы. Не передавайте координаты как локализованные строки; после 6.2 старый допуск запятой как десятичного разделителя в XUnit удалён.
• Логи. Подключите общий logger приложения, чтобы ошибки чтения внешних PDF не терялись внутри фонового задания.
• Набор регрессии. До первой серьёзной интеграции соберите реальные PDF от основных источников и гоняйте их в CI после обновления библиотеки.
Безопасное удаление
PDFsharp не устанавливает самостоятельную программу, поэтому удаление означает удаление PackageReference из проекта. В .NET 10 используется dotnet package remove PDFsharp, в .NET 9 и более ранних SDK — dotnet remove package PDFsharp. После этого выполните restore и build, чтобы найти оставшиеся обращения к API. Уже созданные PDF-файлы являются обычными файлами и автоматически не удаляются.
Практические кейсы
Формирование счёта с фиксированным макетом
Цель. Сгенерировать одинаковый по геометрии PDF-счёт из данных приложения. Подготовка. Заранее определить размер страницы, координаты полей, набор шрифтов и логотип в JPEG/PNG/BMP. Шаги. Создать PdfDocument, добавить страницу, получить XGraphics, нарисовать логотип, линии таблицы и текстовые значения, затем сохранить файл. Проверка. Открыть результат в двух просмотрщиках, сравнить номер счёта, сумму, обрезание текста и встроенные шрифты. Ограничение. Если строки имеют непредсказуемую длину и документ должен автоматически перетекать на новые страницы, лучше перейти на MigraDoc или другой layout-движок.
Сборка пакета из выбранных страниц
Цель. Собрать один файл из страниц нескольких PDF без растеризации. Подготовка. Убедиться, что входные файлы открываются PDFsharp и, если они защищены, доступны необходимые пароли. Шаги. Открыть источники в режиме Import, создать новый PdfDocument и в требуемом порядке добавить выбранные страницы. Проверка. Сравнить число страниц, их порядок, размеры MediaBox/CropBox и работоспособность ссылок, если они критичны. Ограничение. Некоторые интерактивные структуры, подписи и связи между объектами документа могут требовать отдельной проверки после переноса страниц.
Добавление водяного знака без редактирования исходного текста
Цель. Нанести на каждую страницу служебную отметку «Черновик» или идентификатор. Подготовка. Сохранить резервную копию исходного PDF и выбрать шрифт с гарантированным resolver. Шаги. Открыть документ для модификации, для каждой страницы создать XGraphics и нарисовать поверх исходного содержимого текст или графику с нужным преобразованием и прозрачностью, затем сохранить новый файл. Проверка. Убедиться, что отметка видна на страницах разной ориентации и не закрывает важные поля. Ограничение. Это добавление нового контента, а не поиск и изменение старого content stream.
Защита PDF паролем и правами
Цель. Создать файл, открываемый по пользовательскому паролю, с ограничениями на отдельные действия. Подготовка. Определить user и owner password и политику шифрования. Шаги. До сохранения задать SecuritySettings, выбрать современное шифрование — обычно AES-128 по умолчанию либо AES-256 при использовании PDF 2.0 — и настроить разрешения. Проверка. Открыть файл пользовательским и owner-паролем в целевом viewer и убедиться, что сценарий соответствует требованиям. Ограничение. PDF-permissions не заменяют контроль доступа к самому файлу в ОС или хранилище.
Цифровая подпись серверного документа
Цель. Подписать сформированный PDF сертификатом X.509. Подготовка. Безопасно предоставить приложению сертификат и закрытый ключ; если нужна отметка времени, выбрать TSA и продумать сетевую доступность. Шаги. Подключить PdfSharp.Cryptography, настроить PdfSharpDefaultSigner либо собственный IDigitalSigner и сохранить документ с CMS-подписью. Проверка. Валидировать подпись независимым PDF-viewer, проверить цепочку сертификата и timestamp. Ограничение. Хранить пароль PFX открытым текстом в исходном коде нельзя; примеры документации с тестовыми сертификатами не являются production-моделью безопасности.
Контроль перед сохранением и передачей
1. Проверьте количество, порядок, ориентацию и размеры страниц.
2. Откройте итог в целевом viewer и ещё одном независимом просмотрщике.
3. Убедитесь, что все требуемые шрифты встроены или корректно разрешаются и кириллица не заменена другой гарнитурой.
4. Для защищённого PDF отдельно протестируйте user/owner password и реальные разрешения в целевом ПО.
5. Для цифровой подписи выполните независимую валидацию сертификата и отметки времени.
6. Сравните размер с ожидаемым диапазоном: резкий рост может быть следствием изображений, шрифтов или разворачивания object streams.
7. Сохраните эталонный документ в регрессионном наборе, чтобы следующее обновление пакета проверялось автоматически.
Паспорт обратимости операций
| Операция | Обратимость | Что сохранять до действия | Что проверять после |
|---|---|---|---|
| Создание нового PDF | Исходные данные остаются отдельно | Шаблон, данные, шрифты, изображения | Визуальный результат и метаданные |
| Merge/split страниц | Высокая при наличии исходников | Все исходные PDF | Порядок страниц и интерактивные элементы |
| Добавление графики поверх страницы | Нет простого Undo после сохранения | Оригинальный PDF | Наложение, ориентацию, отсутствие перекрытий |
| Шифрование | Снимается при наличии достаточных прав/пароля | Owner password и незашифрованный оригинал по политике хранения | Открытие и права в целевом viewer |
| Цифровая подпись | Изменение после подписи меняет проверяемое состояние | Неподписанный исходник и безопасно хранимый ключ | Цепочку доверия и целостность |
| Пересохранение существующего PDF | Байтово не обратимо без исходника | Оригинальный файл | Размер, rendering и структуру |
Практический вывод прост: PDFsharp следует использовать по модели «input неизменяем, output новый», если нет явной причины перезаписывать исходник. Библиотека не ведёт журнал действий пользователя и не предоставляет настольный Undo. Версионирование и откат должны обеспечиваться приложением, файловым хранилищем или системой документооборота.
Часто задаваемые вопросы
Можно ли открыть PDFsharp и вручную отредактировать документ?
Нет. PDFsharp — библиотека, а не самостоятельный редактор. Ручной интерфейс нужно создавать самому или выбирать готовый PDF-редактор.
Умеет ли PDFsharp показывать PDF или превращать страницу в PNG?
Нет. Preview-контроль PDFsharp визуализирует операции XGraphics, но не рендерит готовые PDF-страницы. Для PDF-to-image нужен другой движок или внешний инструмент.
Можно ли заменить слово в существующем PDF?
Универсального высокоуровневого API для редактирования существующего текстового content stream нет. Можно читать PDF на низком уровне и добавлять новое содержимое, но «редактирование как в Word» не является функцией PDFsharp.
Есть ли OCR?
Нет. PDFsharp не распознаёт текст на сканах. OCR нужно выполнять отдельным движком, после чего его результат можно использовать при создании или дальнейшей обработке PDF.
Чем PDFsharp отличается от MigraDoc?
PDFsharp — низкоуровневый API страницы и PDF-объектов. MigraDoc — высокоуровневая модель документа с абзацами, таблицами, стилями и автоматическим разбиением по страницам, которая рендерит PDF на базе PDFsharp.
PdfSharpCore — это та же библиотека?
Нет. PdfSharpCore — отдельный порт старой версии с namespace PdfSharpCore и другими зависимостями для шрифтов и изображений. Современный PDFsharp Core — официальная кроссплатформенная ветка проекта empira.
Стоит ли сразу ставить PDFsharp 7 Preview?
Для эксперимента и проверки будущей совместимости — да. Для production официальный проект рекомендует актуальную стабильную версию; 7.0.0-preview-1 содержит breaking changes и остаётся prerelease.
Вывод
PDFsharp 6.2.4 — зрелый выбор для .NET-проекта, которому нужен программный контроль над PDF без пользовательского интерфейса и сложной коммерческой лицензии. Библиотека особенно уместна для документов с фиксированным макетом, объединения и разделения страниц, водяных знаков, шифрования, цифровой подписи и серверной автоматизации. MIT-лицензия и три варианта сборки позволяют встроить её и в Linux-сервис, и в Windows-приложение.
Выбирать PDFsharp не стоит, если основной сценарий — визуальное чтение, OCR, рендеринг страниц в изображения или ручное редактирование текста уже готового PDF. Для сложной потоковой верстки удобнее MigraDoc или специализированный генератор; для извлечения и анализа текста — PdfPig; для корпоративного SDK с другой глубиной функций можно оценить iText с учётом лицензии. Sumatra PDF занимает соседнее, но не конкурирующее место: это инструмент конечного пользователя для просмотра готовых документов, тогда как PDFsharp работает внутри кода, который эти документы создаёт и преобразует.