|
Записывает поток перекрестных ссылок PDF 1.5 /Type /XRef (ISO 32000-1 7.5.8) вместо текстовой последовательности xref ... trailer. Полезная нагрузка контейнера сжимается Flate с предсказанием PNG Up (/DecodeParms /Predictor 12), разрядность полей в /W подстраивается под фактический диапазон смещений (расширяется за пределы 4 GiB вместо усечения), а дыры в списке свободных объектов сворачиваются в подсекции /Index, так что разреженные номера объектов больше не занимают по отдельной строке
Синтаксис Delphi:
property UseXRefStream: Boolean;
Синтаксис C++:
__property bool UseXRefStream;
Описание
Когда UseXRefStream включен, EndDoc записывает один косвенный потоковый объект /Type /XRef вместо устаревшей текстовой последовательности таблицы xref + trailer + startxref. Записи используют /W [1 4 2]: однобайтовое поле типа, четырехбайтовое смещение (или номер содержащего объекта для сжатого объекта) и двухбайтовую генерацию (или индекс сжатого объекта). Вся таблица сжимается FlateDecode, что на больших документах обычно урезает накладные расходы xref в 4-10 раз
Потоки XRef — жесткое требование функции UseObjectStreams: только бинарный поток xref может закодировать записи типа 2 для сжатых объектов, которые указывают на контейнеры /Type /ObjStm. Выключение UseXRefStream автоматически отключает UseObjectStreams при сохранении
Значение по умолчанию: false (opt-in - сохраняет текстовую таблицу xref для инструментов, где ключевое слово xref жестко зашито в код, и для максимальной совместимости с PDF 1.4 / более старыми читалками)
Установка UseXRefStream в true для документа, у которого Version ниже PDF 1.5, молча игнорируется при сохранении - вместо этого записывается текстовая xref
PDF/A-1 тоже заставляет использовать текстовую xref: ISO 19005-1 построена на PDF 1.4, а пункт 6.1.4 запрещает потоки перекрестных ссылок, поэтому когда PDFACompliance задает уровень part-1 (например, 'B' или 'A'), EndDoc сбрасывает UseXRefStream и UseObjectStreams при сохранении, как бы они ни были установлены; PDF/A-2 и PDF/A-3 построены на PDF 1.7 и продолжают учитывать оба свойства
Пример кода
HPDF := THotPDF.Create( nil );
try
HPDF.FileName := 'c:\Output.pdf';
HPDF.Version := pdf15; // Required for XRef streams
HPDF.UseXRefStream := true; // Emit /Type /XRef instead of xref table
HPDF.UseObjectStreams := true; // Optional: also pack objects into /Type /ObjStm
HPDF.Compression := cmFlateDecode;
HPDF.BeginDoc;
HPDF.CurrentPage.TextOut( 100, 100, 0, 'Compact PDF 1.5 output' );
HPDF.EndDoc;
finally
HPDF.Free;
end;
См. также
UseObjectStreams, Compression, Version, PDF Filter Support
|