property CharacterGenerated[Index: Integer]: Boolean; // read only
| Index | Индекс символа на текущей странице с нуля, в диапазоне от 0 до CharacterCount - 1 |
CharacterGenerated возвращает True, когда символ по указанному индексу порождён самим PDFium, а не присутствовал в исходном content stream. Типичные примеры: разложение лигатур (глиф лигатуры fi разбивается на f + i), замыкающий пробел, который PDFium вставляет между визуально разделёнными соседними текстовыми прогонами, и символы переноса строки, добавляемые в конец каждой визуальной строки
У сгенерированных символов нет собственной отрисовки в content stream страницы, поэтому их габаритные боксы выводятся из соседних глифов. Если нужен пиксельно точный hit-testing, относитесь к их позиции на странице осторожно: CharacterRectangle может схлопнуться в область нулевой ширины или высоты
Для задач вроде точного дословного извлечения (цифровые подписи, хэширование текста, ASCII-точное сравнение с content stream страницы) сначала отфильтруйте сгенерированные символы. Для обычного поиска по тексту и копирования в буфер флаг чисто информационный — PDFium уже вставил эти символы, потому что пользователи их ожидают
True дают замыкающие межпрогонные пробелы; не считайте, что сгенерированные символы всегда невидимые глифы
// Build a verbatim string that contains only characters from the content stream
var
I: Integer;
S: WString;
begin
S := '';
for I := 0 to Pdf.CharacterCount - 1 do
if not Pdf.CharacterGenerated[I] then
S := S + Pdf.Character[I];
Memo1.Text := S;
end;