property CharacterMapError[Index: Integer]: Boolean; // read only
| Index | Индекс символа на текущей странице с нуля, в диапазоне от 0 до CharacterCount - 1 |
CharacterMapError возвращает True, когда PDFium не смог отобразить символ по указанному индексу в Unicode code point. Пока флаг равен True, значение из Character[Index] ненадёжно и часто деградирует до символа замены (#$FFFD) или до прямого прогона лежащего в основе идентификатора глифа
Флаг чаще всего поднимается на PDF от драйверов принтеров и конвертеров, которые встраивают подмножества шрифтов без соответствующей ToUnicode CMap или с CMap, не покрывающей весь набор глифов. Сканированные PDF со встроенным OCR-текстом и PDF с кастомными encoding vectors — типичные источники ошибок отображения
Тем, кому нужно гонять текст из 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;