ABCpdf

ABCpdf позволяет из кода создавать PDF, собирать документы из HTML, изображений и готовых страниц, добавлять текст, графику, формы, подписи и защиту, а затем сохранять результат в файл, поток или массив байтов. Основная работа строится вокруг объекта Doc, области размещения Rect, параметров страницы, модулей импорта, HTML-движков, операций анализа и рендеринга, поэтому один и тот же процесс подходит для счетов, отчётов, печатных макетов, электронных форм и серверной пакетной обработки.

Рабочий процесс начинается в проекте .NET: пакет добавляют через NuGet либо подключают сборки вручную, после чего создают Doc, задают размер страницы и рабочий прямоугольник, помещают содержимое и вызывают Save или GetData. Графического макетчика для сборки документа нет, поэтому расположение элементов определяется координатами, свойствами объектов и кодом; для проверки доступны примеры, демонстрационные утилиты и просмотр результата в обычном PDF-ридере.

ABCpdf полезен там, где PDF должен формироваться повторяемо и без ручных действий: приложение может взять шаблон, подставить данные, продолжить HTML на следующих страницах, объединить вложения, проставить нумерацию, сжать изображения, проверить соответствие стандарту и подписать итог. При работе с чужими файлами доступны дерево PDF-объектов, операции поиска текста и изображений, аннотации, поля формы, слои, рендеринг страниц и сохранение изменённого документа без печати через виртуальный принтер.

Скачать ABCpdf

Оценка 9.7 Рекомендуем
  • Редактирование PDF
  • Русский интерфейс
  • Просто новичкам
Скачать бесплатно на Windows
Лучшая альтернатива
ABCpdf
Оценка 8.5
  • Нет визуального редактора
  • Нужен код на .NET
  • Office требует помощника
Скачать ABCpdf
Загрузка начнётся после нажатия

Подключение ABCpdf и первая проверка проекта

Самый предсказуемый способ начать работу — добавить пакет ABCpdf через диспетчер NuGet в тот проект, который действительно будет запускать генерацию. В окне управления пакетами нужно проверить выбранный проект, целевую платформу и наличие зависимостей для требуемых функций. Основная сборка даёт классы создания и изменения PDF, а HTML-движки, обработка JavaScript форм, трёхмерных аннотаций и некоторые конвертеры используют дополнительные файлы. Если сборка проходит, но на сервере возникает ошибка загрузки нативного компонента, сравнивают содержимое выходной папки с локальной: одного файла управляемой сборки для всех сценариев недостаточно.

Пакет ABCpdf в диспетчере NuGet Visual Studio

При ручном подключении ссылку добавляют на управляемую сборку, соответствующую целевой среде .NET, а нативные файлы копируют рядом с исполняемым модулем. В проектах, где разрядность процесса может меняться из-за настроек пула IIS или параметра Prefer 32-bit, лучше зафиксировать архитектуру и протестировать именно опубликованную сборку. Ошибка BadImageFormatException обычно указывает не на повреждение PDF, а на смешение x86 и x64 либо на попытку загрузить нативную библиотеку неподходящим процессом.

Подключение сборки ABCpdf через Reference Manager

До создания первого Doc необходимо установить лицензионный ключ или убедиться, что пробный ключ доступен процессу. Утилита PDFSettings показывает состояние регистрации и позволяет сохранить ключ на компьютере разработчика. При публикации копированием файлов регистрационные сведения операционной системы не переносятся автоматически, поэтому на целевой машине ключ обычно устанавливают вызовом XSettings.InstallLicense до создания любых PDF-объектов. Проверка возвращаемого значения полезнее, чем ожидание исключения при Save: журнал запуска сразу покажет, какая лицензия обнаружена и на каком этапе возникла проблема.

Окно PDFSettings с вводом лицензионного ключа ABCpdf

Минимальная проверка состоит из четырёх действий: создать Doc в конструкции using, задать Rect с полями, добавить короткий текст и сохранить файл в доступную для записи папку. Затем документ открывают независимым ридером и сверяют размер страницы, наличие встроенного шрифта и корректность русских символов. Такой тест отделяет ошибки развёртывания от ошибок шаблона: пока одноабзацный PDF не создаётся стабильно, подключать HTML, подпись или импорт Office преждевременно.

using var doc = new Doc();
doc.Rect.String = "50 50 545 792";
doc.FontSize = 18;
doc.AddText("Проверка генерации PDF");
doc.Save("check.pdf");

Doc реализует освобождение ресурсов, поэтому using нужен даже для короткой операции. Он закрывает внутренние потоки, временные объекты и нативные структуры после сохранения. В сервисе с большим числом запросов нельзя держать один Doc в статическом поле и менять его из разных потоков: многопоточность означает возможность выполнять независимые задания параллельно, а не безопасно совместно редактировать один экземпляр. Для каждого задания создают собственные Doc, XImage и операции, а общими оставляют только неизменяемые настройки и кэш приложения.

Страницы, прямоугольники и система координат

Почти каждое действие ABCpdf зависит от текущей страницы и прямоугольника Doc.Rect. MediaBox задаёт физический лист, CropBox ограничивает видимую область, а Rect определяет место, куда попадёт очередной текст, HTML-фрагмент, изображение или импортированная страница. Координаты PDF обычно отсчитываются от левого нижнего угла в пунктах: 72 пункта соответствуют одному дюйму. Поэтому лист A4 описывают примерно как 595 на 842 пункта, а поля в 36 пунктов дают половину дюйма с каждой стороны.

Для однотипных страниц удобно один раз сохранить геометрию: назначить MediaBox, скопировать его в Rect и выполнить Inset на величину полей. После AddPage текущей становится новая страница, но свойства оформления и прямоугольника следует проверять явно, особенно если в документ импортировались страницы другого формата. Смешанный набор A4, Letter и альбомных приложений не стоит приводить к единому размеру механическим масштабированием: печатные поля, подписи и штрихкоды могут потерять требуемые размеры.

Методы AddText и AddImageHtml заполняют Rect по-разному. Текстовый метод возвращает идентификатор созданного объекта и позволяет узнать, поместился ли текст, а цепочка HTML возвращает идентификатор продолжения, который передают при создании следующей страницы. Если прямоугольник слишком мал, часть содержимого может не появиться, поэтому код должен проверять остаток, а не считать один вызов равным одной странице. Для отчёта с переменной длиной цикл продолжается до тех пор, пока движок сообщает о непоместившемся фрагменте.

При наложении штампа на существующий PDF важен PageNumber. После Read текущая страница не всегда совпадает с той, на которой ожидается операция; безопасный цикл явно присваивает номер страницы, восстанавливает Rect из её MediaBox и только затем добавляет объект. Поворот страницы тоже влияет на визуальное положение: Rotate в словаре страницы и поворот содержимого — разные механизмы. Перед размещением координатного элемента проверяют Rotation и при необходимости применяют матрицу преобразования.

Практика с единицами и привязками

  • Для размеров в миллиметрах используют коэффициент 72/25,4 и округляют только на последнем шаге.
  • Для текста у правого края сначала измеряют строку выбранным шрифтом, затем вычисляют левую координату.
  • Для нижнего колонтитула создают отдельный Rect, не меняя область основного потока без сохранения прежнего значения.
  • Для изображения сохраняют пропорции по отношению ширины XImage к высоте, а не растягивают его точно по Rect.
  • Для печатных меток учитывают BleedBox и TrimBox, если они уже присутствуют в макете типографии.

ABCpdf позволяет менять матрицу преобразования Doc.Transform, поэтому один и тот же набор команд можно повернуть, перенести или масштабировать. Это полезно для боковой маркировки, повторяющихся этикеток и раскладки нескольких страниц на одном листе. Матрицу нужно возвращать к исходному состоянию после каждого блока; иначе следующий текст неожиданно наследует поворот или масштаб. Надёжный шаблон сохраняет прежнюю матрицу, применяет изменение в ограниченной секции и восстанавливает её перед продолжением.

Создание текста и управление типографикой

Текст добавляется не только строкой и размером. Doc поддерживает выбор гарнитуры, начертания, цвета, межстрочного интервала, выравнивания, расстояния между словами и символами, отступов абзаца и поведения при переносе. Для простого заголовка достаточно установить Font, FontSize и HPos, но многоязычный отчёт требует проверить таблицу символов шрифта и его встраивание. Если выбранная гарнитура не содержит кириллицу, PDF может выглядеть правильно на компьютере разработчика за счёт подстановки и сломаться на другом устройстве.

Для устойчивого результата шрифты задают по файлу или по однозначному имени, разрешают внедрение и проверяют, что лицензия гарнитуры допускает такое использование. Подмножество уменьшает размер: в PDF попадают только реально использованные глифы. Полное внедрение нужно, когда документ позднее редактируется и может получить новые символы. Служебные шрифты для штрихкодов и машинного чтения тестируют особенно тщательно, поскольку визуально похожая подстановка меняет закодированное значение.

ABCpdf работает с Unicode, поддерживает языки справа налево, лигатуры и контекстные формы, однако автоматический результат зависит от шрифта и способа подачи текста. Для арабского или иврита проверяют направление абзаца, порядок смешанных фрагментов с цифрами, позицию знаков пунктуации и извлечение текста из итогового PDF. Правильно выглядящая строка не всегда имеет правильный логический порядок для поиска и экранного диктора, поэтому визуальная проверка должна дополняться TextOperation или внешним тестом извлечения.

При сложной вёрстке полезно разделять содержимое на стили и данные. Заголовки, основной текст, примечания, табличные числа и подписи получают собственные функции, которые назначают шрифт и геометрию, а затем возвращают прежние параметры Doc. Такой подход предотвращает распространённую ошибку: после жирного заголовка весь остаток страницы случайно сохраняет тот же шрифт или размер.

Текст может быть частью HTML, нативной команды PDF или векторного пути. Нативный текст лучше для поиска, копирования, доступности и малого размера. Превращение в кривые уместно для редкой декоративной надписи, когда гарантировать наличие шрифта невозможно, но оно увеличивает число объектов и лишает строку семантики. VectorizeTextOperation следует применять осознанно и только к тем элементам, для которых потеря текстового слоя допустима.

Текст в существующем документе

ABCpdf не является редактором абзацев с перерасчётом всей страницы. Содержимое PDF хранится как последовательность операторов позиционирования и рисования, поэтому замена слова на более длинное не сдвинет соседние элементы автоматически. Практичный сценарий — закрыть прежний фрагмент, добавить новый текст в рассчитанную область либо работать с заранее подготовленным полем формы. Для массовой персонализации лучше исходно проектировать шаблон с резервом по ширине и ограничениями на длину значений.

TextOperation анализирует размещённые символы, объединяет их в слова и строки, помогает искать фрагменты по тексту или области, устранять переносы и лигатуры при извлечении. Координаты найденного результата можно использовать для выделения, ссылки, комментария или редактирования. При этом поиск следует нормализовать: разные генераторы PDF кодируют пробелы, составные символы и переносы неодинаково. Проверка на наборе реальных документов надёжнее одного идеального примера.

Линии, фигуры, пути и цветовые пространства

Нативные команды рисования подходят для рамок таблиц, диаграмм, печатей, подложек и технических схем. Doc умеет добавлять линии, прямоугольники, овалы и пути Безье, задавать толщину обводки, тип соединения, окончания линий и штриховой узор. Заливка и обводка настраиваются отдельно, поэтому фигура может иметь полупрозрачную заливку, сплошной контур и собственный режим наложения.

Цвет можно задавать в Gray, RGB, CMYK, Lab, калиброванных и плашечных пространствах. Для экранного отчёта обычно достаточно RGB, а печатный макет требует согласованного CMYK-профиля и контроля overprint. Простое преобразование чисел RGB в CMYK не гарантирует совпадения на бумаге: существенны ICC-профиль, бумага и условия печати. При импорте готового PDF лучше сохранять исходные пространства, если техническое задание не требует унификации.

Слой прозрачности позволяет создавать водяные знаки и мягкие выделения, однако PDF/A и некоторые печатные процессы ограничивают прозрачность. FlattenTransparencyOperation преобразует прозрачные группы в непрозрачное сочетание растровых и векторных элементов. Настройки подбирают на копии, сравнивают внешний вид и только затем применяют к партии. Слишком низкое разрешение растрирования делает мелкий текст размытым, а чрезмерное разрешение резко увеличивает файл.

Пути удобнее примитивов, когда контур содержит отверстия, сложные кривые или собственное правило заливки. Для повторяющегося знака один объект можно разместить несколько раз с разными матрицами, не дублируя тяжёлые данные. Это особенно заметно в этикетках, где логотип повторяется десятки раз. После создания проверяют, не встроен ли один и тот же ресурс заново при каждом вызове; XObject и повторное использование изображения обычно дают меньший PDF.

Пример ABCpdf.Drawing показывает перенос привычных операций System.Drawing в PDF: обводку и заливку путей, кривые Безье, отсечение, пунктир, прозрачность, текст и растровые изображения. Такой слой полезен при миграции существующей отрисовки отчёта, но следует помнить о различиях измерения шрифта и сглаживания. Координаты, которые идеально совпадали на экране, нужно перепроверить в векторном документе и на печати.

Изображения: добавление, кадры, качество и прозрачность

XImage загружает растровый или векторный файл и сообщает его размеры, число кадров и свойства. Поддерживаются распространённые JPEG, PNG, GIF, TIFF, BMP, JPEG 2000, WebP, HEIF, PSD и PSB, а также метафайлы, EPS, XPS, SVG и ряд специализированных форматов. Конкретный путь импорта зависит от формата: JPEG часто можно поместить почти без перекодирования, а SVG, EPS или WPF требуют преобразования в PDF-графику.

Для фотографии выгодно сохранять исходное JPEG-сжатие, если изображение не обрезается и не меняет цветовое пространство. Повторное декодирование и кодирование ухудшает детали и иногда увеличивает размер. PNG с альфа-каналом нужен для логотипов и снимков интерфейса; при размещении следует проверить, что прозрачные края не получили чёрный фон. TIFF может содержать несколько кадров, и индекс кадра выбирают явно, иначе в документ попадёт только первая страница скана.

AddImageObject размещает уже загруженный XImage в текущем Rect. Если один логотип используется на каждой странице, объект XImage держат в рамках задания и добавляют повторно, а не читают файл с диска в каждом цикле. Пропорции рассчитывают по Width и Height. Для режима вписать выбирают меньший коэффициент масштабирования; для режима заполнить — больший и затем применяют отсечение, чтобы не исказить изображение.

Качество печати определяет не размер файла в пикселях сам по себе, а эффективное разрешение после размещения. Снимок шириной 1200 пикселей, растянутый на 10 дюймов, даёт около 120 dpi и выглядит мягко. Тот же снимок на ширине 4 дюйма даёт 300 dpi. До сборки отчёта полезно вычислять эффективный dpi и помечать изображения ниже заданного порога, особенно фотографии документов и штрихкоды.

При повороте JPEG можно потерять возможность прямого внедрения и получить новое сжатие. Если требуется лишь визуально повернуть объект на странице, матрица размещения обычно лучше физического вращения пикселей. Обрезка тоже может выполняться прямоугольником отсечения, сохраняя исходный ресурс. Физическое уменьшение имеет смысл для оптимизации, когда скрытая часть и избыточные пиксели больше никогда не нужны.

Изображения из недоверенной загрузки проверяют до передачи XImage: ограничивают размер, число кадров, декодированное количество пикселей и время обработки. Небольшой сжатый файл может раскрыться в огромный растр и исчерпать память. Серверному процессу также нельзя без фильтра позволять читать произвольный путь, указанный пользователем; допустимые каталоги и расширения задаются приложением.

Чтение и изменение существующих PDF

Doc.Read принимает путь, массив байтов или поток и строит объектную модель документа. Для зашифрованного файла передают пароль через параметры чтения. Если используется отложенная загрузка, входной поток или файл должен оставаться доступным до завершения всех операций: закрытие слишком рано приводит к ошибке лишь при обращении к поздней странице или при Save. В простом сценарии безопаснее держать поток открытым внутри того же using-блока, что и Doc.

Сохранять изменённый документ поверх входного пути рискованно. Чтение может продолжаться по требованию, а Save попытается открыть тот же файл на запись; кроме блокировки, сбой посередине повредит единственную копию. Надёжная схема пишет во временный файл в том же томе, закрывает Doc, проверяет результат и затем атомарно заменяет оригинал. Для облачного хранилища аналогом служит новый объект с последующим переключением ссылки.

Страницы можно добавлять из другого Doc, копировать, удалять и переставлять. AddImageDoc помещает страницу как графический объект в заданный Rect, что удобно для монтажа нескольких страниц на листе. RemapPages меняет порядок и отбирает диапазоны. Для простого объединения важно перенести не только внешний вид, но и аннотации, закладки, имена, поля форм и вложения, если они нужны. Разные методы импорта сохраняют разные уровни интерактивности, поэтому результат проверяют не только визуально.

Дерево объектов даёт доступ к Catalog, Pages, Page, словарям, массивам, потокам и ссылкам. Это позволяет исправлять нестандартные метаданные, анализировать ресурсы страницы, менять Optional Content Groups и исследовать повреждённые файлы. Низкоуровневое редактирование требует знания PDF: неправильная ссылка или длина потока может сделать документ нечитаемым. Перед изменением неизвестного узла сохраняют копию и проверяют файл несколькими ридерами.

PDFSurgeon с деревом PDF-объектов и предпросмотром страницы

PDFSurgeon показывает, как связаны объектный браузер, свойства выбранного узла, содержимое потока и рендер страницы. Изменение оператора можно увидеть в предпросмотре, но такая утилита предназначена для диагностики, а не для повседневной правки текста. Она особенно полезна, когда нужно понять, почему цвет, маска, шрифт или ресурс ведёт себя иначе, чем ожидается из высокоуровневого кода.

Исправление структуры страниц

После объединения файлов проверяют PageCount, размеры MediaBox и CropBox, поворот, нумерацию закладок и ссылки GoTo. Если удалены страницы, внутренние назначения могут указывать на отсутствующий объект. Поля с одинаковыми именами из разных форм иногда объединяются логически и начинают менять значение одновременно; перед слиянием их переименовывают или уплощают в зависимости от задачи.

Повреждённый PDF иногда открывается в ридере благодаря автоматическому восстановлению, но падает при строгом разборе. В таком случае сначала пробуют прочитать и сохранить копию без дополнительных изменений, чтобы ABCpdf перестроил таблицы ссылок. Если чтение не удаётся, анализируют сообщение и размер файла, исключают HTML-страницу с ошибкой, ошибочно названную PDF, и проверяют первые байты на сигнатуру `%PDF-`. Расширение файла само по себе ничего не доказывает.

HTML в PDF: выбор движка и разбиение на страницы

Для HTML используются AddImageUrl и AddImageHtml. Первый получает страницу по адресу, второй принимает строку разметки. Оба метода помещают результат в Doc.Rect, поэтому HTML можно комбинировать с нативным заголовком, штампом или готовым бланком. Чтобы длинная страница продолжилась, идентификатор, возвращённый первым вызовом, передают в AddImageToChain на следующей странице и повторяют цикл, пока остаток не закончится.

Доступны движки семейства Chromium, Gecko и системный HTML-механизм Windows. Современные CSS Grid, Flexbox, SVG и сценарии обычно сначала проверяют в Chromium-движке. Gecko полезен как альтернативный интерпретатор, когда веб-страница рассчитана на Firefox. Системный механизм применяют для старых шаблонов, зависимых от поведения Internet Explorer. Один шаблон нельзя считать переносимым между движками без теста: размеры шрифтов, печатные поля и момент завершения JavaScript могут отличаться.

BrowserWidth задаёт виртуальную ширину окна, а Rect — физическую область на листе. Если HTML адаптивный, изменение BrowserWidth переключает медиазапросы и может полностью перестроить сетку. Для стабильного отчёта выбирают фиксированную ширину, задают печатный CSS и отключают ненужные анимации. Масштабирование после рендеринга лучше оставлять последним средством, поскольку оно уменьшает и текст, и линии, и интерактивные области.

Разметка, переданная строкой, часто содержит относительные пути к стилям, картинкам и шрифтам. Движку нужна базовая папка или BaseURI, иначе ресурс не найдётся и страница получится без оформления. Более надёжный шаблон встраивает критический CSS, использует контролируемые абсолютные пути приложения и заранее проверяет доступность файлов от имени сервисного процесса. Путь, открывающийся в учётной записи разработчика, может быть закрыт для IIS, контейнера или фоновой службы.

JavaScript и AJAX требуют ожидания. Если вызвать сохранение сразу после события загрузки, график или таблица может ещё не появиться. Настройки HTML-операции позволяют разрешить сценарии и задать задержку либо критерий готовности. Фиксированная большая пауза замедляет каждый запрос и всё равно не гарантирует завершение при сетевой ошибке; лучше, чтобы страница выставляла известный признак после построения данных, а обработчик завершал рендер по этому признаку.

Печатные разрывы задают CSS-свойствами break-before, break-after и break-inside, но движок всё равно ограничен высотой Rect. Таблицу с повторяющейся шапкой оформляют через семантический thead и тестируют на нескольких страницах. Неразрывный блок выше страницы не может уместиться целиком: он либо переполнит область, либо будет масштабирован или разрезан в зависимости от механизма. Длинные изображения заранее уменьшают или разрешают разрыв в подходящем месте.

Ссылки из HTML могут преобразовываться в PDF-аннотации. Перед публикацией проверяют, какие адреса попали в документ, особенно если шаблон содержит служебные ссылки, кнопки или элементы навигации. Для отчёта часто стоит скрыть меню, интерактивные панели и элементы управления через `@media print`. Поля HTML-формы не всегда равны AcroForm-полям PDF; если получателю нужны заполняемые поля, их создают отдельными объектами после рендеринга.

Надёжная схема HTML-конвертации

  1. Сформировать отдельную печатную разметку без элементов, не относящихся к документу.
  2. Зафиксировать ширину окна, шрифты, язык и часовой пояс, влияющие на формат данных.
  3. Разрешить только необходимые сценарии и дождаться явного признака завершения.
  4. Продолжать цепочку на новых страницах до полного исчерпания HTML.
  5. Добавить колонтитулы нативными командами после того, как известно общее число страниц.
  6. Проверить ссылки, встроенные шрифты, переносы таблиц и отсутствие пустой последней страницы.

При конвертации внешних сайтов нужно учитывать аутентификацию, cookies, заголовки, прокси и сертификаты. Гораздо безопаснее передавать движку уже подготовленный HTML, чем разрешать ему ходить по адресу, который целиком задаёт пользователь. Иначе функция может стать каналом доступа к внутренним адресам, метаданным облака или локальным файлам. Сетевые разрешения ограничивают, адреса фильтруют, а процесс рендеринга изолируют от секретов приложения.

Импорт документов Office, RTF, XPS, EPS и SVG

RTF, XPS, OXPS, EPS, SVG и изображения можно использовать как входные форматы, но степень сохранения структуры различается. XPS и EPS являются форматами описания страницы, поэтому обычно подходят для визуально точного переноса. SVG хорошо работает для логотипов и схем, если используемые фильтры, шрифты и внешние ресурсы поддерживаются. RTF описывает текстовую разметку, и его перенос нужно проверять на таблицах, списках, табуляции и встроенных объектах.

Файлы Word, Excel и PowerPoint требуют механизма, способного интерпретировать исходный формат. В рабочих сценариях ABCpdf использует WordGlue, Microsoft Office либо OpenOffice как помощника. Это означает, что одной команды Read недостаточно, если на машине нет подходящего преобразователя и его разрешения не настроены. Автоматизация Office в безынтерактивной службе особенно чувствительна к профилю пользователя, диалогам восстановления, принтерам и правам на временную папку.

Для пакетного сервера предпочтительна схема, которая не показывает диалогов и имеет ограничение времени. Документ может содержать повреждённую связь, макрос, запрос обновления или шрифт, отсутствующий на машине. Процесс-помощник запускают с отдельной учётной записью, не дают ему доступ к лишним сетевым ресурсам и принудительно завершают зависшее задание. Входные файлы из почты или загрузки предварительно сканируют и обрабатывают в изоляции.

Excel требует особой подготовки: область печати, повторяющиеся строки, ориентация, масштаб уместить на лист и скрытые листы определяют результат сильнее, чем размеры ячеек на экране. Перед преобразованием полезно нормализовать эти параметры в исходном документе. PowerPoint обычно переносится как одна страница на слайд; заметки докладчика, скрытые слайды и мультимедиа обрабатывают отдельно в соответствии с задачей.

Если нужна гарантированная точность, сравнивают эталонные страницы пиксельным рендерингом, а не только визуально открывают один файл. Набор тестов должен включать таблицы, диаграммы, сложные шрифты, прозрачность, повороты, колонтитулы и документы с разными региональными настройками. Конвертер, который хорошо обрабатывает простой договор, может иначе интерпретировать финансовую книгу с внешними связями.

Формы, поля и аннотации

AcroForm-поля позволяют получателю вводить текст, выбирать переключатель, отмечать флажок, работать со списком, нажимать кнопку и ставить подпись. ABCpdf создаёт поля, задаёт имя, значение, прямоугольник, шрифт, цвет и внешний вид. Имя важно не меньше координат: поля с одним именем считаются представлениями одного значения. Для группы радиокнопок это полезно, а для двух независимых текстовых полей приведёт к неожиданной синхронизации.

PDF с интерактивными полями формы, созданными ABCpdf

Внешний вид поля хранится в appearance stream. Некоторые ридеры умеют перестраивать его сами, другие показывают пустую область до фокуса, если поток не создан. После изменения значения на сервере следует обновить внешний вид и проверить файл в нескольких программах. Флаг NeedAppearances не заменяет корректно сформированное представление во всех сценариях, особенно при печати и преобразовании в изображение.

Заполнение шаблона обычно строится по именам: приложение открывает документ, ищет поля, сопоставляет их с данными, ограничивает длину и назначает значения. Для даты, суммы и номера договора форматируют строку до присваивания. Если текст может не поместиться, заранее выбирают размер шрифта или включают допустимое автоматическое масштабирование. Слишком мелкий автоподбор делает форму формально заполненной, но непригодной для чтения.

Уплощение превращает интерактивный внешний вид в обычное содержимое страницы и удаляет возможность редактирования поля. Это полезно перед отправкой неизменяемой копии, PDF/A-преобразованием или наложением электронной подписи. Уплощать исходный шаблон до заполнения нельзя. Также нужно решить, сохранить ли значения и структуру для последующей проверки либо сформировать отдельную финальную копию.

Аннотации охватывают текстовые заметки, выделения, подчёркивания, зачёркивания, линии, многоугольники, фигуры, штампы, файловые вложения и другие интерактивные элементы PDF. Координаты аннотации относятся к странице, а её внешний вид может быть отдельным потоком. При повороте страницы проверяют как прямоугольник, так и appearance stream: ридер может правильно повернуть одно и неправильно показать другое.

Разметка PDF линиями, выделением и фигурами в примере ABCpdf

Текстовая заметка, вложение и штампы в PDF, созданном ABCpdf

JavaScript в форме способен рассчитывать значения и реагировать на действия, но поддержка отличается между ридерами, а корпоративные политики могут отключать сценарии. Критичный расчёт выполняют на сервере и записывают итог в поле, оставляя JavaScript лишь для удобства. Перед подписью проверяют, что скрытые действия и ссылки не попали из чужого шаблона.

Слои и управляемая видимость

Optional Content Groups создают слои, которые пользователь может включать и выключать в поддерживающем ридере. Они подходят для языковых вариантов чертежа, технических пометок, нескольких наборов размеров и печатных отметок. Слой — не просто логический список объектов: PDF содержит группы, конфигурации видимости, порядок отображения и правила зависимости, поэтому поведение может отличаться от обычного чекбокса.

Демонстрационная программа ABCpdf для управления слоями OCG

Демонстрационная утилита OCG показывает список слоёв, иерархию и команды создания простых, вложенных и взаимозависимых групп. Для документа, который должен одинаково печататься во всех условиях, нужно явно задать состояние печати, а не полагаться на экранную видимость. Перед объединением файлов проверяют совпадение имён групп: одинаковое название не гарантирует, что это один и тот же логический слой.

Скрытие объекта слоем не является удалением конфиденциальных данных. Текст и изображения остаются в файле и могут быть извлечены или снова включены. Для настоящего удаления используют операцию редактирования с удалением соответствующих операторов и ресурсов, а затем проверяют текстовый слой, вложения, метаданные и предыдущие ревизии.

Поиск, выделение и необратимое удаление данных

Редактирование конфиденциальных фрагментов начинается с TextOperation: приложение получает логические слова и их геометрию, ищет строку либо выбирает элементы внутри прямоугольника. Найденные участки можно подсветить для проверки, а затем удалить и закрыть непрозрачной областью. Простого чёрного прямоугольника поверх текста недостаточно — исходные операторы останутся доступными для копирования.

Пример ABCpdf для поиска и удаления текста из PDF

В демонстрации видны режимы поиска по тексту и области, список выбранных элементов и команды удаления текста, изображений или всего содержимого выбранной зоны. Для производственного процесса полезен двухэтапный режим: оператор отмечает найденное, другой сотрудник подтверждает, после чего сервис создаёт финальную копию. Автоматический поиск по фамилии или номеру может пропустить разорванные символы, текст в изображении и альтернативное написание.

Удаление изображения требует учитывать маску, миниатюру, повторно используемый XObject и копии на других страницах. Если один ресурс используется в нескольких местах, физическое изменение объекта затронет все ссылки. Безопаснее определить, нужно удалить конкретное размещение или сам ресурс. После редактирования запускают извлечение текста, перебирают изображения, проверяют вложенные файлы и метаданные.

Предыдущие инкрементальные ревизии могут сохранять старое содержимое. Если документ ранее подписывался или дописывался, новая запись поверх конца файла не обязательно удаляет байты старого состояния. Для финальной очищенной копии выполняют полное сохранение с перестроением файла, а затем убеждаются, что удалённые данные не обнаруживаются бинарным поиском и специализированным анализатором. После такого переписывания прежние подписи обычно перестают быть действительными, что нужно учитывать в процессе согласования.

Цифровые подписи, сертификаты и проверка

Поле подписи содержит визуальную область и криптографическую подпись над байтами определённой ревизии. ABCpdf умеет создавать поле, подписывать сертификатом, добавлять сведения о подписанте и проверять подпись. Сертификат может находиться в файле, хранилище операционной системы, аппаратном устройстве или внешнем сервисе, если реализован пользовательский подписывающий обработчик.

Секретный ключ нельзя хранить рядом с кодом или в открытом конфигурационном файле. Для серверной подписи используют защищённое хранилище, аппаратный модуль либо службу управления ключами, а приложению дают минимальные разрешения. Пароль к PFX не выводят в журнал и не передают через аргументы командной строки. При аппаратной подписи учитывают ограничение длины подписи и время обращения к устройству.

PAdES-профиль определяет не только алгоритм, но и сведения, необходимые для долгосрочной проверки. Базовая подпись подтверждает неизменность байтов, временная метка фиксирует момент, а долгосрочные уровни добавляют сертификаты и данные об отзыве. Для долговременного хранения нужен доступ к OCSP или CRL во время формирования, доверенная временная метка и проверка всей цепочки. Один визуальный значок подписано не доказывает пригодность для долговременного хранения.

Подписание выполняют после всех изменений, которые должны быть защищены. Добавление номера страницы, оптимизация, уплощение формы или преобразование PDF/A после подписи изменит байты. Некоторые допустимые изменения могут быть оформлены новой инкрементальной ревизией, однако ридер покажет, что документ изменялся после первой подписи. Последовательность шагов фиксируют заранее: заполнение, проверка, уплощение по необходимости, стандартизация, подпись, временная метка и окончательная валидация.

При проверке нужно различать математическую корректность, доверие к сертификату, срок действия, отзыв, допустимые изменения и соответствие требуемому профилю. Сертификат может верно подписывать файл, но не быть доверенным на конкретной машине. Результат Validate записывают вместе с деталями цепочки и временем проверки, а не сводят к одному логическому значению.

Пароли, шифрование и разрешения PDF

PDF поддерживает пароль открытия и пароль владельца, шифрование содержимого и набор разрешений на печать, копирование, изменение и заполнение форм. ABCpdf позволяет назначать эти параметры при сохранении. Пароль открытия реально ограничивает чтение без ключа, а разрешения владельца зависят от соблюдения правил программой просмотра. Их нельзя считать полноценной защитой от намеренного извлечения данных.

Для конфиденциального документа выбирают современное шифрование, генерируют длинные случайные пароли и передают их по отдельному каналу. Записывать пароль в имя файла, тему письма или тот же контейнер с документом бессмысленно. В сервисе пароль не должен появляться в журнале исключений. Временные незашифрованные копии удаляют после завершения, а папку ограничивают по правам.

Если входной PDF защищён, Read должен получить корректный пароль. Ошибка открытия может означать не только неправильный пароль, но и повреждение, неподдерживаемый обработчик безопасности или файл другого формата. В интерфейсе пользователю возвращают нейтральное сообщение, а в защищённый технический журнал — конкретный код ошибки без раскрытия пароля.

Шифрование препятствует некоторым оптимизациям и изменению объектов на месте. После снятия защиты и повторного сохранения документ следует проверить на разрешения и метаданные: новые параметры не обязаны совпадать со старыми. Подписанный зашифрованный файл обрабатывают только в порядке, согласованном с требованиями подписи.

Рендеринг страниц и экспорт

XRendering превращает страницу PDF в растровое изображение. Настраиваются разрешение, цветовое пространство, глубина цвета, сглаживание, фон, отрисовка аннотаций, overprint и формат сохранения. Для миниатюры достаточно умеренного dpi и JPEG либо PNG; для OCR и печатной проверки нужен более высокий dpi, но расход памяти растёт пропорционально числу пикселей.

Страница A4 при 300 dpi занимает примерно 2480 на 3508 пикселей. В несжатом RGB это около 26 мегабайт только для одного буфера, без промежуточных слоёв. Параллельный рендер десятков страниц может быстро исчерпать память. Очередь ограничивают по числу одновременных задач, результаты сразу записывают в поток, а большие документы обрабатывают по страницам.

DrawAnnotations определяет, попадут ли комментарии и поля в изображение. Для юридической копии обычно нужен внешний вид всех видимых аннотаций; для анализа базового содержимого их отключают. Прозрачный фон полезен при наложении страницы на другой макет, но JPEG не поддерживает альфа-канал. PNG и TIFF лучше подходят для прозрачности и чёткой графики.

Рендеринг — хороший инструмент регрессионного теста. Эталон и новый PDF преобразуют в изображения с одинаковыми параметрами, затем сравнивают размеры и метрику сходства. Небольшое различие сглаживания не должно маскировать пропавшую строку или смещённую таблицу, поэтому автоматический порог дополняют визуальным отчётом с выделением отличий.

Сохранение в XPS, EPS, SVG, PostScript и растровые форматы применяют для обмена с системами, которые не принимают PDF. Каждый экспорт теряет часть возможностей: интерактивные поля, вложения, закладки, подписи или семантические теги могут исчезнуть. До выбора формата составляют список обязательных свойств и проверяют их в целевом приложении.

PDF/A, PDF/UA и доступность

PdfConformityOperation проверяет и преобразует документ под требования PDF/A. Конкретный профиль выбирают по регламенту организации: уровни отличаются допустимыми функциями и требованиями к структуре. Обычно требуется встроить шрифты, корректно описать цвет, удалить запрещённые действия и обеспечить метаданные. Конвертация не должна быть финальным доказательством соответствия — результат проверяют валидатором и анализируют каждую ошибку.

Прозрачность, мультимедиа, JavaScript, внешние зависимости и некоторые виды шифрования конфликтуют с профилями долговременного хранения. До преобразования лучше устранить их целенаправленно. Автоматическое уплощение может изменить внешний вид, поэтому сравнивают страницы до и после. Если отсутствующий шрифт нельзя встроить, нужно заменить его в исходном шаблоне либо получить лицензированную гарнитуру, а не игнорировать предупреждение.

PDF/UA требует логической структуры: заголовков, абзацев, списков, таблиц, подписей к полям, альтернативного текста изображений и правильного порядка чтения. Визуальное расположение само по себе не создаёт семантику. XTagging и AccessibilityOperation помогают построить или дополнить дерево тегов, определить артефакты и связать содержимое со структурными элементами.

Автоматическая операция может разумно распознать простой документ, но сложная газетная сетка, вложенная таблица или декоративная врезка неоднозначны. Официальный пример AccessiblePDF показывает обнаружение заголовков, секций, таблиц, списков и артефактов, а также добавление тегированного содержимого в уже структурированный файл. Для производственного шаблона правила лучше задавать с учётом известной разметки, чем пытаться восстановить смысл по координатам после генерации.

Проверка доступности включает чтение с клавиатуры и экранным диктором, а не только автоматический отчёт. У поля формы должно быть понятное имя, у изображения — содержательный альтернативный текст, у таблицы — заголовочные ячейки и связи. Декоративные линии и фон помечают как артефакты, чтобы они не засоряли порядок чтения. Язык документа и фрагментов задают явно, особенно для смешанного текста.

Оптимизация размера без потери смысла

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

Сначала измеряют вклад компонентов. Если документ состоит из ста полноцветных сканов, оптимизация структуры даст мало по сравнению с ресемплингом. Если это векторный отчёт с десятками полностью встроенных шрифтов, полезнее подмножества и устранение дубликатов. Если файл вырос после объединения одинаковых шаблонов, ищут повторяющиеся XObject и ресурсы.

Для изображений задают порог эффективного dpi: ресурс уменьшают только тогда, когда после размещения он заметно превышает требуемое разрешение. Чёрно-белые сканы выгодно кодировать профильным двоичным методом, серые документы — в Gray, фотографии — JPEG с контролируемым качеством. Скриншоты интерфейса и схемы лучше сохраняют резкие края в PNG или другом без потерь.

После оптимизации проверяют текстовый поиск, формы, подписи, теги доступности, ссылки и цвет. Если операция переписывает подписанные байты, подпись станет недействительной. Оптимизацию выполняют до подписи. Для PDF/A повторно запускают валидатор, поскольку изменение ресурсов может нарушить профиль.

Оценивать результат только размером нельзя. Полезный отчёт содержит исходный и итоговый объём, время обработки, число страниц, максимальное и среднее разрешение изображений, список изменённых шрифтов и результат визуального сравнения. Тогда настройки можно объяснить и воспроизвести, а не подбирать вслепую для каждого файла.

Большие документы, память и параллельная обработка

ABCpdf рассчитан на документы, превышающие обычный объём памяти, но приложение всё равно отвечает за потоки, очереди и жизненный цикл объектов. Отложенная загрузка снижает начальные затраты, пока нужны только отдельные страницы, однако входные данные должны оставаться доступными. Принудительная загрузка всего файла упрощает управление потоком, но для гигабайтного документа может быть неприемлемой.

Пакетную задачу делят на этапы: чтение, преобразование, валидация, сохранение и публикация. Каждый этап имеет ограничение времени и памяти, а промежуточный файл получает уникальное имя. Если процесс аварийно завершился, уборщик удаляет просроченные временные данные. Запись прямо в ответ веб-запроса удобна для малого файла, но не оставляет возможности проверить результат до отправки; для важного документа лучше сначала завершить и валидировать отдельный поток.

Многопоточность достигается независимыми экземплярами. Число параллельных HTML-движков и конвертеров Office ограничивают сильнее, чем число простых операций с текстом, поскольку каждый может запускать отдельный процесс и потреблять сотни мегабайт. Размер пула подбирают нагрузочным тестом на реальных шаблонах, фиксируя медиану, высокий перцентиль и долю ошибок.

Кэширование шрифтов и неизменяемых файлов ускоряет повторные задания, но объекты Doc нельзя возвращать в общий пул после частичного сбоя. Нативное состояние может уже содержать незавершённую операцию. Проще и безопаснее создать новый экземпляр, а повторно использовать только проверенные байты шаблона, настройки и заранее вычисленные данные.

Для ограничения памяти полезно рендерить или импортировать страницы последовательно, сразу освобождать XImage и не хранить все растровые копии в коллекции. Большой массив byte[] размещается в крупной куче .NET и создаёт давление на сборщик мусора. Поток в файл или хранилище обычно лучше, если API следующего этапа не требует цельного массива.

Журнал должен связывать все шаги идентификатором задания, но не содержать текст документа, пароль, ключ подписи или персональные данные. Записывают имя операции, страницу, время, размер, выбранный движок, код исключения и результат проверки. Этого достаточно, чтобы локализовать сбой без утечки содержимого.

Развёртывание в IIS, службе, контейнере и Linux

Публикация через NuGet обычно копирует управляемые и нативные файлы в выходной каталог, но итог нужно проверять после режима Publish, а не только в bin отладочной сборки. Некоторые типы старых веб-проектов без полноценного файла проекта не переносят все зависимости автоматически. Список файлов фиксируют в сборочном тесте и сравнивают с артефактом публикации.

В IIS важны разрядность пула, идентичность учётной записи, права на каталог приложения и временную папку, загрузка профиля пользователя и ограничения запуска дочерних процессов. HTML-движок или преобразователь Office может работать в отладочной консоли и падать в пуле из-за отсутствия профиля либо запрета на запуск. Диагностику выполняют под той же учётной записью и с теми же переменными среды.

В контейнере образ должен содержать нативные зависимости, шрифты и библиотеки HTML-движка. Шрифты устанавливают явно и не полагаются на состав машины разработчика. Для кириллицы и CJK добавляют нужные семейства и проверяют лицензию внедрения. Каталоги временных файлов монтируют с достаточным объёмом, правами и политикой очистки. Контейнер с файловой системой только для чтения требует отдельно доступного временного пути.

На Linux развёртывание ориентировано на поддерживаемые выпуски Ubuntu. Часть технологий, тесно связанных с Windows, например WPF и системный HTML-механизм, там недоступна или требует альтернативного пути. Для HTML используют подходящий кроссплатформенный движок и его пакет. До переноса составляют таблицу реально вызываемых функций, а не делают вывод по тому, что простое создание текста работает.

Ключ устанавливают в коде до создания объектов. Это особенно важно для эфемерных контейнеров, где реестр или машинная настройка не сохраняется. Ключ передают через секрет среды или защищённое хранилище оркестратора, не встраивают в образ и не печатают в лог. На старте можно вывести только безопасное описание состояния лицензии.

Проверка готовности сервиса не должна каждый раз строить тяжёлый HTML. Достаточно создать маленький PDF в памяти, убедиться в сигнатуре и освободить объекты; расширенный тест движка запускают отдельно по расписанию или при развёртывании. Так балансировщик не создаёт лишнюю нагрузку, а проблема с дополнительным компонентом всё равно обнаруживается до пользовательского запроса.

Типовые ошибки ABCpdf и способы устранения

СимптомВероятная причинаЧто проверить
Исключение появляется при SaveЛицензия не установлена для процессаВызов XSettings.InstallLicense до создания Doc и безопасное описание лицензии
BadImageFormatExceptionНе совпали архитектуры процесса и нативной DLLНастройки x86/x64, Prefer 32-bit, разрядность пула IIS и состав publish
Не найден HTML-движокНе скопированы дополнительные файлы либо запрещён запускВыходной каталог, права, антивирус, дочерние процессы и временную папку
HTML без стилей и картинокОтносительные пути не разрешилисьBaseURI, права на файлы, сетевой доступ и точность регистра имён
График отсутствуетСохранение началось до завершения JavaScriptРазрешение сценариев, признак готовности и ограничение времени ожидания
Русский текст заменён квадратикамиШрифт не содержит глифов или не внедрёнФайл гарнитуры, Unicode, права внедрения и список Fonts в PDF
Нельзя сохранить поверх входного файлаОтложенное чтение удерживает файлНовый выходной путь, срок жизни потока и атомарную замену после закрытия
Память растёт при рендерингеСлишком высокий dpi или много одновременных страницРазмер растра, очередь, последовательную обработку и освобождение XRendering
Поля пусты до щелчкаНе обновлён appearance streamГенерацию внешнего вида и проверку в нескольких PDF-ридерах
Подпись недействительнаДокумент изменён после подписанияПорядок оптимизации, уплощения, стандартизации и подписи
Office-конвертация зависаетПомощник открыл диалог или ждёт ресурсОтдельную учётную запись, тайм-аут, макросы, связи и профиль пользователя
На Linux пропал нужный шрифтГарнитура не установлена в образСписок fontconfig, точное семейство, внедрение и пересборку контейнера

При диагностике сначала воспроизводят ошибку на минимальном файле и отделяют этапы. Если Read проходит, а Save падает, проблема не обязательно во входном PDF; это может быть лицензия, путь или свободное место. Если простой HTML работает, а боевой шаблон нет, сравнивают ресурсы и сценарии. Если сбой зависит от конкретной страницы, рендерят и анализируют только её, чтобы сократить цикл проверки.

Исключение сохраняют целиком вместе с внутренними исключениями и стеком, но очищают персональные данные. Сообщение пользователю формулируют отдельно. Повторять операцию автоматически можно только для временных сетевых ошибок или занятого ресурса; повреждённый PDF, неверный пароль и отсутствие лицензии от повторов не исправятся.

Практический сценарий: счёт или акт из шаблона

Для документа с фиксированным фирменным бланком удобен PDF-шаблон. Приложение читает его в Doc, выбирает первую страницу и размещает переменные значения в заранее согласованных прямоугольниках. Суммы форматируются до вставки, дата получает однозначный формат, а длинные реквизиты проходят проверку ширины. Логотип уже хранится в шаблоне и не дублируется при каждом создании.

Табличную часть строят строками: измеряют высоту описания, проверяют остаток страницы и при нехватке добавляют новую страницу с повторной шапкой. Нельзя сначала нарисовать рамку фиксированной высоты, а потом обнаружить, что название товара заняло три строки. Высота строки определяется максимальной высотой всех её ячеек, после чего рисуются фон, границы и текст.

Итоги и подписи помещают только после завершения таблицы. Если блок не умещается целиком, создают новую страницу, чтобы подпись не оторвалась от суммы. Затем вторым проходом добавляют Страница X из Y, потому что общее число страниц уже известно. После сборки проверяют отрицательные суммы, нулевые количества, очень длинные номера и отсутствие необязательных реквизитов.

Финальная цепочка может включать уплощение заполненных полей, PDF/A-преобразование и подпись. Каждая операция выполняется один раз в установленном порядке. Результат сохраняют во временный поток, валидируют, вычисляют контрольную сумму и только затем публикуют в хранилище или возвращают клиенту.

Практический сценарий: объединение пакета документов

Пакет может состоять из основного отчёта, сканов, приложений и сопроводительного листа. Сначала все входы классифицируют: PDF читают напрямую, изображения превращают в страницы с правильным размером, Office-файлы отправляют в ограниченный конвертер. Ошибка одного вложения не должна оставлять частично опубликованный пакет; задание завершается только после успешной сборки всех обязательных частей.

При добавлении страниц сохраняют исходную ориентацию и размер. Масштабирование применяют лишь к изображениям, для которых нет собственного формата страницы. Закладки создают по разделам и направляют на первую страницу каждого вложения. Если в исходных PDF уже были закладки, решают, вложить их в общий раздел или удалить, чтобы не получить дублирующиеся корни.

Поля форм с одинаковыми именами переименовывают либо уплощают до слияния. Подписи исходных документов сохраняют только если метод объединения не переписывает их байты; часто юридически корректнее вложить подписанные файлы как отдельные вложения, а не разбирать их страницы. Общий пакет затем подписывается отдельно, если процесс этого требует.

Нумерацию ставят поверх итоговых страниц, но не закрывают штрихкоды и подписи. Для смешанных размеров координату вычисляют относительно CropBox каждой страницы. Перед выдачей проверяют последовательность, число страниц, наличие пустых листов, читаемость сканов и открытие всех вложенных файлов.

Практический сценарий: веб-отчёт на нескольких страницах

Шаблон отделяют от обычной веб-страницы: убирают навигацию, интерактивные фильтры и элементы, которые не должны печататься. Данные встраивают в HTML на сервере, критические стили включают в документ, а изображения получают контролируемые пути. Виртуальную ширину фиксируют, чтобы адаптивная сетка не менялась между средами.

В Doc создают первую страницу, назначают Rect с полями и вызывают AddImageHtml. Пока возвращается продолжение, добавляют страницу и продолжают цепочку. После завершения удаляют возможную пустую последнюю страницу, если шаблон содержит принудительный разрыв в конце. Колонтитулы и номера накладывают отдельным проходом.

Диаграммы строятся до признака готовности. Если библиотека графиков использует canvas, проверяют разрешение и масштаб; SVG обычно даёт более чёткий векторный результат. Внешние шрифты должны успеть загрузиться, иначе первый рендер может использовать замену. Для стабильности шрифт размещают рядом с приложением и ждут завершения Font Loading API в шаблоне.

Регрессионный набор содержит короткий отчёт, таблицу на несколько страниц, длинное неразрывное поле, изображения с прозрачностью, RTL-текст и страницу без данных. Для каждого сохраняют число страниц и изображения контрольных областей. Такой набор быстро обнаруживает изменение движка, CSS или шрифта после обновления среды.

Практический сценарий: миниатюры и анализ входного PDF

Сервис предпросмотра читает PDF из потока, проверяет PageCount и ограничивает допустимое число страниц. Для каждой страницы создаёт XRendering с небольшим dpi, белым фоном и нужным режимом аннотаций, затем сохраняет PNG или JPEG. Файлы именуются по порядку с ведущими нулями, чтобы сортировка не ставила десятую страницу перед второй.

Параллельно TextOperation извлекает текст для поиска. Результат связывают с номером страницы и нормализуют пробелы, но сохраняют исходные координаты для подсветки. Если текст отсутствует, страница может быть сканом; тогда решение об OCR принимает отдельный этап. Рендеринг сам по себе не распознаёт символы.

Для безопасности ограничивают размер PDF, число объектов и время обработки. Предпросмотр запускается в рабочем процессе без доступа к секретам. Ошибочный файл получает статус с техническим кодом, но не останавливает очередь остальных документов. Миниатюра считается успешно созданной только после декодирования полученного изображения тестовым компонентом.

Практический сценарий: доступный документ

Лучший результат получается, когда семантика известна во время генерации. Функция заголовка одновременно рисует текст и открывает соответствующий структурный тег; таблица создаёт Table, TR, TH и TD; декоративный фон помечается артефактом. Порядок тегов следует логике чтения, даже если визуально элементы расположены в нескольких колонках.

Изображение получает альтернативный текст, если несёт смысл, либо статус артефакта, если декоративно. Ссылка должна иметь понятный текст и аннотацию, связанную с тегом. Поле формы получает имя, подсказку и правильный порядок обхода. Язык документа задаётся на уровне каталога, а фрагменты другого языка отмечаются отдельно.

После создания запускают AccessibilityOperation как помощник и проверку, но не принимают автоматические догадки без просмотра. Затем документ тестируют клавиатурой, экранным диктором и независимым валидатором. Ошибки исправляют в шаблоне, а не постобработкой каждой отдельной копии, чтобы результат был воспроизводимым.

Практический сценарий: безопасное редактирование

Список чувствительных значений формируется из структурированных данных: имени, номера счёта, идентификатора, адреса и вариаций написания. TextOperation ищет их на каждой странице, а результаты сохраняются с координатами и контекстом. Совпадения, которые могут быть неоднозначны, отправляются на подтверждение.

Подтверждённые фрагменты удаляются из потоков содержимого, после чего добавляется непрозрачная метка. Для сканов требуется отдельное обнаружение изображения и OCR-координат; нанесение рамки поверх картинки без удаления пикселей оставляет исходные данные внутри ресурса. Участок изображения физически изменяют или заменяют безопасным растром.

Финальный PDF полностью переписывается, очищается от вложений и ненужных метаданных. Затем автоматически проверяется отсутствие искомых строк, извлекаются все изображения для контрольного анализа и строятся миниатюры. Только после этой проверки файл получает статус разрешённого к выдаче.

Сравнение ABCpdf с аналогами

ПрограммаЛучше подходит дляГлавное ограничение
ABCpdfГлубокой генерации, импорта, анализа, HTML-конвертации и низкоуровневой правки PDF в .NETМакеты и операции задаются кодом, а дополнительные движки усложняют публикацию
PDF CommanderРучного редактирования, объединения, подписания и подготовки PDF пользователемНе предназначен для встраивания серверной генерации в программный код
iTextСтандартов PDF, форм, подписей и корпоративных процессов с API для .NET и JavaОткрытая лицензия накладывает AGPL-обязательства, а коммерческое использование требует оценки лицензии
Aspose.PDF for .NETШирокого набора преобразований и операций с документами в экосистеме AsposeКоммерческая лицензия и необходимость проверять точность сложного HTML на своих шаблонах
Syncfusion PDF LibraryПроектов .NET, уже использующих компоненты Syncfusion и единый стек для документов и интерфейсаУсловия лицензирования зависят от организации, а HTML обычно решается отдельным компонентом
PDFsharp и MigraDocСоздания отчётов и базовых операций в проектах, где важен открытый кодНет полноценного браузерного HTML-движка и глубокой правки произвольного содержимого
QuestPDFНовой декларативной вёрстки отчётов через удобный fluent APIНе предназначен для общего редактирования существующих PDF и прямого HTML-рендеринга

ABCpdf выбирают, когда одному .NET-процессу нужны и создание, и разбор объектов, и несколько способов импорта, а команда готова контролировать нативные зависимости. PDF Commander удобнее сотруднику, которому требуется вручную исправить готовый документ без разработки. iText логичен для процессов, где особенно важны стандарты и подписи, но лицензионную модель нужно согласовать заранее. Aspose.PDF и Syncfusion стоит проверять на уже используемом стеке и эталонных файлах. PDFsharp с MigraDoc подходят для более простых открытых решений, а QuestPDF — для новых отчётов, чья разметка полностью описывается кодом и не требует изменения чужих PDF.

Как оценить ABCpdf на собственных документах

Проверку начинают не с длинного списка функций, а с пяти самых рискованных файлов организации. Обычно это сложный HTML-отчёт, подписанный PDF, многостраничный скан, форма с JavaScript и документ Office с таблицами. Для каждого фиксируют ожидаемое число страниц, контрольные области, шрифты, интерактивные свойства и допустимое время обработки.

Затем создают минимальные независимые тесты: чтение и сохранение, рендер первой страницы, извлечение текста, HTML-цепочка, заполнение формы, оптимизация и подпись. Это показывает, какой компонент вызывает различие. Один монолитный пример, выполняющий всё подряд, затрудняет диагностику и может скрыть ошибку под последующей операцией.

Результаты сравнивают в нескольких PDF-ридерах и на целевой системе печати. Проверяют не только внешний вид, но и копирование текста, закладки, ссылки, значения полей, подписи, доступность и размер. Для серверной нагрузки запускают параллельный тест с тем же числом работников и лимитами памяти, которые будут в эксплуатации.

Развёртывание считается проверенным, когда опубликованный артефакт проходит тест на чистой машине или в новом контейнере без инструментов разработчика. В нём должны присутствовать нужные нативные файлы, движки, шрифты и секрет лицензии, переданный безопасным способом. Такой тест обнаруживает случайную зависимость от глобального GAC, установленного Office, пользовательского профиля или файла, оставшегося в рабочей папке.

Контрольный список перед вводом процесса в эксплуатацию

  • Каждый Doc, XImage, XRendering и поток освобождается в определённом месте.
  • Входной PDF не перезаписывается до успешной проверки новой копии.
  • Разрядность и нативные зависимости совпадают с опубликованным процессом.
  • Лицензионный ключ устанавливается до первого PDF-объекта и не попадает в журнал.
  • HTML имеет фиксированную ширину, доступные ресурсы и явный признак завершения сценариев.
  • Шрифты присутствуют на целевой машине, содержат нужные символы и внедряются законно.
  • Поля формы получают внешний вид, уникальные имена и проверяются в разных ридерах.
  • Оптимизация и стандартизация выполняются до электронной подписи.
  • Редактирование удаляет данные, а не только закрывает их графической фигурой.
  • PDF/A и PDF/UA проверяются независимыми валидаторами и практическим чтением.
  • Очередь ограничивает число тяжёлых рендеров и процессов Office.
  • Временные файлы имеют уникальные имена, ограниченные права и автоматическую очистку.
  • Нагрузочный тест использует реальные документы, а не только пустые страницы.
  • Мониторинг фиксирует время, размер, страницу и код ошибки без содержимого документа.

После выполнения этих проверок ABCpdf можно использовать как единый программный конвейер: входные данные превращаются в предсказуемые страницы, чужие PDF проходят контролируемые изменения, а финальный файл получает нужные поля, защиту, стандартизацию и подпись. Качество результата определяется не количеством вызванных методов, а точным порядком операций, управлением ресурсами и тестами на тех же шаблонах, шрифтах и среде, где документ будет создаваться.