property CharacterMapError[Index: Integer]: Boolean; // read only
| Index | Индекс символа с нуля на текущей странице в диапазоне от 0 до CharacterCount - 1 |
CharacterMapError возвращает True, когда PDFium столкнулся с ошибкой при сопоставлении символа по указанному индексу с кодовой точкой Unicode. Когда значение равно True, результат Character[Index] ненадёжен и часто сводится к символу замены (#$FFFD) либо к прямой передаче идентификатора базового глифа
Этот флаг чаще всего возникает в PDF, созданных драйверами принтера и инструментами преобразования, которые встраивают подмножества шрифтов без соответствующей ToUnicode CMap или с CMap, не покрывающей полный набор глифов. Типичные источники таких ошибок сопоставления — отсканированные PDF с внедрённым OCR-текстом и PDF, использующие собственные векторные схемы кодирования
Код, которому нужно сохранить текст из PDF без потерь, должен сначала отфильтровать или пометить срабатывания CharacterMapError, прежде чем считать их пригодным для поиска содержимым. Серия подряд идущих ошибок сопоставления обычно указывает на целый фрагмент строки, который лучше извлечь повторно через OCR, а не через текстовый слой
True и текущая страница уже разобрана; иначе оно возвращает False
var
I, BadCount: Integer;
begin
BadCount := 0;
for I := 0 to Pdf.CharacterCount - 1 do
if Pdf.CharacterMapError[I] then
begin
Memo1.Lines.Add(Format('Map error at %d (charcode $%x)',
[I, Pdf.Charcode[I]]));
Inc(BadCount);
end;
Caption := Format('%d untranslatable characters on page', [BadCount]);
end;