Не совсем ответ, но я думаю, что вы слишком быстро отвергаете Ghostscript.
Известно ли вам об API GhostScript (для Ghostscript в процессе)? Или в режиме -dJOBSERVER, который может принимать серию команд PS, переданных по стандарту в?
Это все равно не даст вам ваши обратные вызовы, но оно не является многопоточным.
Как уже говорилось, iText может сделать это, но это будет вопрос обхода всего содержимого и изображений в поисках цветовых пространств не оттенков серого и преобразования их в пространственно-ориентированном виде.
Вам также придется заменить данные пикселей в любых изображениях, которые вы можете найти.
Хорошей новостью является то, что iText [Sharp] способен работать в нескольких потоках, при условии, что каждый документ используется из одного потока одновременно.
Я подозреваю, что это также относится и к предлагаемой коммерческой библиотеке, что не очень хорошая сделка.
А потом над моей головой зажегся свет… нарисованный в оттенках серого.
Режимы наложения и группы прозрачности!
Возьмите все содержимое текущей страницы и вставьте его в группу прозрачности, которая смешана со сплошным черным прямоугольником, который покрывает страницу. Я думаю, что есть даже режим яркости альфа-смеси ... давайте посмотрим здесь.
Да, PDF справочный раздел 11.6.5.2 «Словари мягких масок». Вы будете хотеть группу "яркости".
Теперь плохие новости. Если ваша цель при переходе на шкалу серого - сэкономить место, это полностью провалится. Это на самом деле сделает каждый файл немного больше ... скажем, 100 байт на страницу, отдайте или возьмите.
Программное обеспечение для рендеринга PDF тоже должно быть довольно популярным. Проект рендеринга вашего двоюродного брата не должен применяться. Это продвинутые графические материалы, которые нечасто используются в обычных PDF-файлах, поэтому последнее, что нужно реализовать.
Итак ... Для каждой исходной страницы
Создать новую страницу.
Накройте его черным фоном.
Покройте его белым прямоугольником (раньше он был в обратном направлении) в группе прозрачности, в которой словарь мягкой маски установлен в качестве яркости содержимого оригинальной страницы (теперь хранится в форме XObject).
Поскольку это весь ваш собственный код, у вас будет широкая возможность делать все, что вы хотите, в начале или в конце каждой страницы.
Боже, это просто сумасшествие, чтобы работать! Это требует некоторого PDF-Fu, но не так сильно, как «преобразование каждого цветового пространства и изображения различными способами, как я прохожу документ». Более глубокие знания, меньше кода для написания.