iText PDF: замена / преобразование цветов

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

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


Марк Сторер спрашивает:

Чего именно вы пытаетесь достичь?

Превратите это ... в это:

gray pagegreen page

У меня есть несколько документов , для которых я уже использую 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 являются «разделяемыми» режимами: они работают с каждым цветовым каналом независимо. Это означает, что я могу отдельно настроить значения голубого, пурпурного, желтого или черного, но я не могу превратить серый в зеленый.

Для этого я ' d необходимо использовать режим смешивания цветов, который является «неразрывным», т. е. каналы цвета влияют друг на друга. Насколько я могу судить, iText этого не предлагает - ни один из неделимых режимов смешивания не указан среди констант в PdfGState . Я использую iText 5.0.5, последнюю версию на момент написания этой статьи.

Есть ли способ получить доступ к этим режимам наложения в iText или даже взломать их? Есть ли другой способ достижения результата?


Обновление:

Даже установка режима наложения на Цвет не сработала. Я сделал это в коде, чтобы заставить его:

    val gstate = new PdfGState
    gstate.put(PdfName.BM, new PdfName("Color"))
    canvas.setGState(gstate)

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


Марк Сторер спрашивает:

«Цвет» не работает? Веселый. Можем ли мы увидеть PDF?

Вот PDF .

Разместив его в Интернете, я теперь вижу, что режим «Цвет» работает правильно в Chrome, но не работает в Acrobat 9 Pro (CS4). Так что техника правильная, но Adobe не справляется с рендерингом!

Интересно, нет ли какого-то способа «сгладить» эффект режима наложения, чтобы PDF-файл содержал объект желаемого цвета напрямую, а не наложение, предназначенное для получите нужный цвет.

Идея: перевернуть это вверх дном. Использовать существующую страницу в качестве альфа-канала на странице с заполнением

Разместив его в Интернете, я теперь вижу, что режим «Цвет» работает правильно в Chrome, но не работает в Acrobat 9 Pro (CS4). Так что техника верна, но Adobe не справляется с рендерингом!

Интересно, нет ли какого-то способа «сгладить» эффект режима наложения, чтобы PDF-файл содержал объект желаемого цвета напрямую, а не наложение, предназначенное для получите нужный цвет.

Идея: перевернуть это вверх дном. Использовать существующую страницу в качестве альфа-канала на странице с заполнением

Разместив его в Интернете, я теперь вижу, что режим «Цвет» работает правильно в Chrome, но не работает в Acrobat 9 Pro (CS4). Так что техника верна, но Adobe не справляется с рендерингом!

Интересно, нет ли какого-то способа «сгладить» эффект режима наложения, чтобы PDF-файл содержал объект желаемого цвета напрямую, а не наложение, предназначенное для получите нужный цвет.

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

Идея: перевернуть это вверх дном. Использовать существующую страницу в качестве альфа-канала на странице с заполнением поэтому 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 вернулся ко мне и разъяснил проблему: "

  • По умолчанию все неизменяемо
  • Геттеры автоматически определяются
  • Достойная реализация toString ()
  • Соответствует equals () и hashCode ()
  • Сопутствующий объект с методом unapply () для сопоставления

Но что такое недостатки определения неизменяемой структуры данных как класса case?

Какие ограничения это накладывает на класс или его клиентов?

Есть ли ситуации, когда вам следует предпочесть класс без регистра?

103
задан casperOne 12 January 2013 в 15:34
поделиться