Программно измените цвет шрифта текста в PDF

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

Место перечисление в пространстве имен, чтобы препятствовать тому, чтобы константы загрязнили глобальное пространство имен.

namespace RecordType {

перечисление объявляет и определяет время компиляции, проверенное введенный. Всегда используйте проверку типа времени компиляции для проверки, аргументам и переменным дают корректный тип. Нет никакой потребности в определении типа в C++.

enum TRecordType { xNew = 1, xDeleted = 2, xModified = 4, xExisting = 8,

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

xInvalid = 16 };

Полагают, что у Вас есть две цели для этого типа. Отследить текущее состояние записи и создать маску для выбора записей в определенных состояниях. Создайте подставляемую функцию, чтобы протестировать, если значение типа допустимо для Вашей цели; как маркер состояния по сравнению с маской состояния. Это поймает ошибки, как эти typedef просто int и значение такой, как 0xDEADBEEF может быть в Вашей переменной через неинициализированные или mispointed переменные.

inline bool IsValidState( TRecordType v) {
    switch(v) { case xNew: case xDeleted: case xModified: case xExisting: return true; }
    return false;
}

 inline bool IsValidMask( TRecordType v) {
    return v >= xNew  && v < xInvalid ;
}

Добавляют using директива, если Вы хотите использовать тип часто.

using RecordType ::TRecordType ;

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

Вот некоторые примеры для соединения всего этого.

void showRecords(TRecordType mask) {
    assert(RecordType::IsValidMask(mask));
    // do stuff;
}

void wombleRecord(TRecord rec, TRecordType state) {
    assert(RecordType::IsValidState(state));
    if (RecordType ::xNew) {
    // ...
} in runtime

TRecordType updateRecord(TRecord rec, TRecordType newstate) {
    assert(RecordType::IsValidState(newstate));
    //...
    if (! access_was_successful) return RecordType ::xInvalid;
    return newstate;
}

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

10
задан Helen 29 August 2009 в 10:18
поделиться

2 ответа

Выделение возможно в файле pdf с использованием аннотаций PDF, но сделать это изначально не так-то просто. Если какая-либо из упомянутых библиотек предоставляет такую ​​возможность, вы можете поискать ее.

0
ответ дан 3 December 2019 в 22:38
поделиться

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

BT
/F13 12 Tf
288 720 Td
(ABC) Tj
ET

BT и ET - это команды для начала и завершения текстового объекта; Tf - это команда для использования внешнего ресурса шрифта F13 (которым оказывается Helvetica) с размером 12; Td - это команда для установки курсора в заданные координаты; Tj - это команда для записи глифов для предыдущей строки. Его аромат в некоторой степени похож на «отшлифованную нотацию», и действительно очень близок к вкусу Postscript, одного из других значительных вкладов Adobe в набор текста.

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

pyPdf - очень простая библиотека на чистом Python, которая является хорошей отправной точкой для экспериментов с файлами PDF. Его функция «извлечения текста» довольно элементарна и ничего не делает, кроме объединения аргументов нескольких команд рисования текста; ты' Вы увидите, что этого достаточно для одних документов и совершенно непригодно для других, но, по крайней мере, это начало. Распространенный pyPdf практически ничего не делает с цветами, но с некоторыми взломами, которые можно исправить. Мощная библиотека Python

reportlab полностью ориентирована на создание новых PDF-файлов, а не на интерпретацию или изменение существующих. С другой стороны, чистая библиотека Python pdfminer полностью сосредоточена на анализе файлов PDF; он действительно выполняет некоторую кластеризацию, чтобы попытаться восстановить текст в тех случаях, когда более простые библиотеки могут оказаться в тупике.

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

са начало. Распространенный pyPdf практически ничего не делает с цветами, но с некоторыми взломами, которые можно исправить. Мощная библиотека Python

reportlab полностью ориентирована на создание новых PDF-файлов, а не на интерпретацию или изменение существующих. С другой стороны, чистая библиотека Python pdfminer полностью сосредоточена на синтаксическом анализе файлов PDF; он действительно выполняет некоторую кластеризацию, чтобы попытаться восстановить текст в тех случаях, когда более простые библиотеки могут оказаться в тупике.

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

са начало. Распространенный pyPdf практически ничего не делает с цветами, но с некоторыми взломами, которые можно исправить. Мощная библиотека Python

reportlab полностью ориентирована на создание новых PDF-файлов, а не на интерпретацию или изменение существующих. С другой стороны, чистая библиотека Python pdfminer полностью сосредоточена на анализе файлов PDF; он действительно выполняет некоторую кластеризацию, чтобы попытаться восстановить текст в тех случаях, когда более простые библиотеки могут оказаться в тупике.

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

Мощная библиотека Python полностью ориентирована на создание новых PDF-файлов, а не на интерпретацию или изменение существующих. С другой стороны, чистая библиотека Python pdfminer полностью сосредоточена на анализе файлов PDF; он действительно выполняет некоторую кластеризацию, чтобы попытаться восстановить текст в тех случаях, когда более простые библиотеки могут оказаться в тупике.

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

Мощная библиотека Python полностью ориентирована на создание новых PDF-файлов, а не на интерпретацию или изменение существующих. С другой стороны, чистая библиотека Python pdfminer полностью сосредоточена на синтаксическом анализе файлов PDF; он действительно выполняет некоторую кластеризацию, чтобы попытаться восстановить текст в тех случаях, когда более простые библиотеки могут оказаться в тупике.

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

15
ответ дан 3 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: