Что произойдет, если я закончу буквы дисков? хочу изменить их цвета. Например, предположим, что все мои страницы используют оттенки ...
Я использую iText в Java, чтобы выбрать несколько страниц из большого PDF-документа и сохранить их как новый, меньший PDF. В то же время я хотел бы изменить их цвета.
Например, предположим, что все мои страницы используют оттенки серого, а я хочу сделать его зеленым. Все используемые цвета - оттенки серого. Я бы хотел заменить каждый из этих цветов соответствующим зеленым.
Марк Сторер спрашивает:
Чего именно вы пытаетесь достичь?
Превратите это ... в это:
I есть некоторые документы , в которых я уже использую iText для выбора меньшего набора страниц из документа на основе пользовательского ввода - сокращение более 100 страниц примерно до 5. В то же время я хочу производить зеленые, синие, желтые, розовые и т. д. их варианты. Не каждая страница в оттенках серого, но все важные, так что я могу настроить их цветовое пространство, если это необходимо.
Обновление:
Следуя предложению Марка Сторера о режимах наложения, вот что у меня есть:
val reader = new PdfReader(file.toURL)
val document = new Document
val writer = PdfWriter.getInstance(document, outputStream)
document.open()
/* draw a white background behind the page, so the
blend always has something to transform, otherwise
it just fills. */
val canvas = writer.getDirectContent
canvas.setColorFill(new CMYKColor(0.0f, 0.0f, 0.0f, 0.0f))
canvas.rectangle(10f, 0f, 100f, 100f)
canvas.fill
/* Put the imported page on top of that */
val page = writer.getImportedPage(reader, 1)
canvas.addTemplate(page, 0, 0)
/* Fill a box with colour and a blending mode */
canvas.setColorFill(new CMYKColor(0.6f,0.1f,0.0f,0.5f))
val gstate = new PdfGState
gstate.setBlendMode(PdfGState.BM_SCREEN)
canvas.setGState(gstate)
canvas.rectangle(0f, 0f, 100f, 100f)
canvas.fill
document.close()
(Это в Scala, но библиотека iText такая же, как и в Java)
Проблема в том, что все доступные в iText режимы смешивания являются «разделяемыми» режимами: они работают с каждым цветовым каналом независимо. Это означает, что я могу отдельно настроить значения голубого, пурпурного, желтого или черного, но я не могу превратить серый в зеленый.
Для этого мне нужно использовать режим смешивания цветов, который является «неотделимым» ", т.е. цветовые каналы влияют друг на друга. Насколько я могу судить, iText этого не предлагает - ни один из неделимых режимов смешивания не указан среди констант в PdfGState
. Я' m, используя iText 5.0.5, которая является последней версией на момент написания этой статьи.
Есть ли способ получить доступ к этим режимам наложения в iText или даже взломать их? Есть ли другой способ достижения результата?
Обновление:
Даже установка режима наложения «Цвет» не работает. Я сделал это в коде, чтобы заставить его:
val gstate = new PdfGState
gstate.put(PdfName.BM, new PdfName("Color"))
canvas.setGState(gstate)
и я проверил полученный PDF-файл в текстовом редакторе, чтобы убедиться, что он говорит правильно. К сожалению, результат на экране просто не работал. Я понятия не имею, почему, согласно спецификации PDF, это должен быть правильный режим наложения.
Марк Сторер спрашивает:
«Цвет» не сработал? Веселый. Можно посмотреть PDF?
Вот PDF .
Разместив его в Интернете, я теперь вижу, что режим «Цвет» работает в Chrome правильно, но не работает. t работать в Acrobat 9 Pro (CS4). Так что техника правильная, но Adobe не справляется с рендерингом!
Интересно, нет ли какого-то способа «сгладить» эффект режима наложения, чтобы PDF-файл содержал объект желаемого цвета напрямую, а не наложение, предназначенное для получите правильный цвет.
Идея: перевернуть это вверх дном. Использовать существующую страницу в качестве альфа-канала на странице с заполнением полностью желаемого цвета, а не наоборот.
Как? Я не уверен, что GState применимо к добавлению шаблона?
Кроме того, для импортированной страницы сначала потребуется добавить белый фон, иначе она просто будет заливать цветом везде, где нет объекта, а не смешивать.
Я пробовал сделать это:
val canvas = writer.getDirectContent
canvas.setColorFill(new CMYKColor(0.6f,0.1f,0.0f,0.0f))
canvas.rectangle(10f, 0f, 500f, 500f)
canvas.fill
val template = canvas.createTemplate(500f, 500f)
template.setColorFill(new CMYKColor(0f, 0f, 0f, 0f))
template.rectangle(0f, 0f, 500f, 500f)
template.fill
val page = writer.getImportedPage(reader, 1)
template.addTemplate(page, 0, 0)
val gstate = new PdfGState
gstate.put(PdfName.BM, new PdfName("Color"))
canvas.setGState(gstate)
canvas.addTemplate(template, 0, 0)
И вот созданный им PDF . Не совсем верно ни в Chrome, ни в Acrobat :)
Edit : Глупый я. Я изменил режим на «Яркость», создав этот файл . Как и раньше, это выглядит правильно в Chrome, но не в Acrobat.
Я только что проверил, и даже Adobe Reader X не отображает его должным образом. Что, вероятно, означает, что то, что я прошу, невозможно. : (
Решение
Леонард Розенталь из Adobe вернулся ко мне и разъяснил проблему: "