Імпорт SVG Form XObject
Метод THotPDF.ImportSVGFormXObject аналізує SVG один раз і реєструє один багаторазовий PDF Form XObject, тоді як метод THPDFPage.DrawSVGFormXObject розміщує його в будь-якому розмірі та за потреби створює анотації-посилання сторінки
Оголошення
function ImportSVGFormXObject(const Input: TBytes): AnsiString; overload;
function ImportSVGFormXObject(
const Input: TBytes;
out Statistics: THPDFSVGImportStatistics
): AnsiString; overload;
procedure DrawSVGFormXObject(
const FormName: AnsiString;
X, Y, W, H: Single;
AddLinks: Boolean = True
);
Векторний профіль
- Геометрія охоплює шляхи з еліптичними дугами, прямокутники, прямокутники зі заокругленими кутами, кола, еліпси, лінії, ламані лінії, полігони, перетворення, групи, символи та посилання
useлише на фрагменти - Замальовування охоплює суцільні RGB-кольори, прозорість заливки та обводки, правила заливки, завершення й з'єднання ліній, успадковані масиви штрихів та їхні зміщення, межі miter, лінійні та радіальні градієнтні векторні стрічки, градієнтні обводки на основі кольорових tiling-патернів і шляхи обрізання
- Прозорість об'єктів і груп використовує ізольовані векторні Form прозорості, тож перекривні нащадки компонуються до застосування їхньої охоплюючої прозорості
- Маски стають ресурсами Form груп прозорості з PDF м'якими масками Alpha чи Luminosity, зокрема відсікання регіону маски,
maskUnits,maskContentUnitsта обмежені вкладені посилання на маски - CSS охоплює вбудовані селектори типу, класу, ID і комбіновані селектори, атрибути представлення, інлайн-стилі, специфічність, порядок у коді та
!important - Імпорт документів вбудовує підмножини Unicode-шрифтів і карти
ToUnicodeчерез нативний авторинговий рушій, використовує налаштовані ланцюги резервних шрифтів, вирівнює резервні проходи за спільною алфавітною базовою лінією та обчислює прив'язку тексту за фактичними ширинами гліфів - Вбудовані зображення PNG і JPEG стають багаторазовими Image XObjects, зберігають альфа-канал PNG як м'яку маску та підтримують
preserveAspectRatio="none", центрованийmeetі центрованийslice - HTTP-, HTTPS- та mail-посилання зберігаються як прив'язані до розміщення PDF-анотації посилань, не стаючи частиною багаторазового Form-потоку
Текстові межі та межі замальовування
Текст підтримує суцільну заливку, жирний і курсивний варіанти, розмір шрифту, перетворення, прив'язку, прозорість та геометричне відсікання; градієнтна заливка тексту завершується помилкою, а кожен вузол text чи tspan лишається самостійно позиційованим проходом, а не повноцінним рушієм верстки текстового потоку SVG
Текстовий імпорт документів втримує обрану жирну чи курсивну гарнітуру через перевірки гліфів з урахуванням стилю та резервну верстку, зберігає виміряні межі чорнила та відхиляє справді нерозв'язані гліфи
Текст UTF-8 і шістнадцяткові чи десяткові посилання на символи XML зберігають ті самі Unicode-скаляри на Delphi та FPC, зокрема додаткові скаляри, представлені сурогатними парами UTF-16
Автономне перевантаження HPDFBuildSVGFormData без текстового будівника використовує виміряні ширини Helvetica, Times і Courier з базового набору 14 і відхиляє символи поза WinAnsi замість підстановки знаків питання; перевантаження з THPDFSVGTextRunBuilder приймає надані викликачем вбудовані текстові Form та метрики
Градієнти зберігають обмежену апроксимацію векторними стрічками; прозорі ресурси вимагають PDF 1.4 і відхиляються строгим профілем PDF/A-1
Стилі обводки
stroke-dasharray, stroke-dashoffset і stroke-miterlimit працюють через атрибути представлення, вбудований CSS, інлайн-стилі та наслідування, зокрема групи та екземпляри use лише на фрагменти
Масиви штрихів приймають числа, розділені комою чи пробілом, і підтримувані довжини; відсотки використовують нормалізовану діагональ видового порту, обчислювану як sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)
Масиви непарної довжини повторюються, утворюючи візерунок парної довжини, кожен підшлях перезапускає візерунок, а додатні чи від'ємні зміщення загортаються по повному візерунку; none і повністю нульові масиви дають суцільні обводки
Зафарбовані штрихи нульової довжини зберігають круглі чи квадратні кінцеві мітки; звичайні суцільні обводки, патерни градієнтних обводок, відсікання, маски та ізольовані групи прозорості спільно використовують обрані налаштування обводки
Усталена межа miter дорівнює 4; значення SVG 2 від 0 до 1 приймаються і використовують зрізані з'єднання там, де miter перевищив би межу, тоді як межі ресурсів градієнтів і прозорості зберігають гострі з'єднання в межах обраного ліміту
Нативний рендеринг використовує обмежену геометрію штрихів, щоб зберігати зміщення, дробові довжини та масиви, довші за ліміт пера GDI, з адаптивним сплощенням кривих і неперервними зафарбованими з'єднаннями крізь межі сегментів
Калібрування штрихів через pathLength залишається поза цим профілем; фігури, що поєднують несуцільний масив штрихів із pathLength, завершуються помилкою, а не мовчки використовують некалібровані довжини
Семантика обводки слідує моделі обводки SVG 2 у межах бюджетів аналізатора та рендерера, описаних нижче
Конфігурація формування тексту
Вбудований текст SVG використовує налаштування ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam і AutoShapeHanifiRohingya документа, що імпортує, разом із його вибором GSUB-сценарію та мови і ланцюгами резервних шрифтів
Ці налаштування застосовуються і під час вимірювання ширин, і під час генерації текстових виглядів, не змінюючи конфігурацію викликача; shaping залишається опційним і вимагає шрифту, що надає запитувані гліфи та таблиці OpenType
Кожен згенерований текстовий вигляд приймає щонайбільше 256 різних shaping-виборів шрифтів і 64 MiB сумарних сирих даних шрифтів; непідтримувані дані шрифту чи перевищена межа атомарно завершують імпорт помилкою
Прозорість об'єктів і груп
opacity застосовується один раз до повного зафарбованого результату свого вузла і не наслідується нащадками; fill-opacity і stroke-opacity зберігають свої окремі успадковані значення замальовування
Два перекривні непрозорі червоні прямокутники всередині <g opacity="0.5"> залишаються однаково напівпрозорими в зоні перекриття, тоді як два самостійно напівпрозорі прямокутники темнішають там, де перекриваються
Вкладені групи компонуються за порядком: дві охоплюючі прозорості 0.5 дають ефективні 0.25 над непрозорим нащадком, а явна прозорість нащадка 1 не перевизначає його охоплюючу групу
Кореневі вузли SVG, контейнери, посилання, посилання на фрагменти, текст, зображення та фігури використовують той самий шлях прозорості об'єктів; посилання use лише на фрагменти зберігають стилі і екземпляра, і вузла, на який посилаються
Альфа заливки та обводки залишаються незалежними, зокрема в зоні їх перекриття всередині напівпрозорого об'єкта, а альфа стопів градієнта поєднується з відповідною альфою замальовування до композитингу об'єкта
Ефекти відсікання та масок належать своєму вузлу, а не наслідуються як налаштування замальовування нащадків; геометрія посилань залишається прив'язаною до розміщення, а межі ізольованих Form консервативно втримують трансформовані обводки та кінці
Імпортер зберігає векторні оператори, вбудовані текстові Form, ресурси зображень, патерни та маски всередині ізольованих груп; він не сплощує весь SVG у бітмап
Підтримувана поведінка слідує моделі прозорості об'єктів і груп SVG; інші обмеження тексту, градієнтів і геометрії на цій сторінці досі застосовуються
Безпека та бюджети
Імпортер приймає звичайний або gzip-стиснений SVG до 8 MiB, обмежує розгорнуті вхідні дані 32 MiB, об'єднані оператори основного вмісту, pattern, масок і груп – 16 MiB, кількість вузлів – 4,096, вкладеність – 64 рівнями, CSS-правила – 256, а значення шляху – 100,000
Вбудовані зображення приймають лише строгі корисні навантаження Base64 data:image/png;base64, та data:image/jpeg;base64,, щонайбільше 128 зображень, 16,384 пікселів на вимір і 16,777,216 декодованих пікселів на всі зображення; розміри перевіряються перед нативним декодуванням
Текст обмежений 128 проходами та 65,536 одиницями UTF-16 на прохід, а патерни градієнтних обводок, маски та ізольовані групи прозорості – 128 ресурсів кожен; рекурсивні посилання на маски завершуються помилкою
Масиви штрихів містять щонайбільше 64 вихідні записи до розширення непарних масивів; додатні записи мають бути щонайменше 0.000001 користувацьких одиниць, окремі довжини та нормалізований цикл не повинні перевищувати 1,000,000,000, абсолютні зміщення – 1,000,000,000, а межі miter мають залишатися між 0 і 1,000,000
Фактичні вкладені ефекти прозорості обмежені вісьмома рівнями, щоб узгоджуватися з нативним рендерером, незалежно від межі глибини дерева SVG; звичайні вкладені контейнери без ефектів прозорості не витрачають цей дозвіл
Межі ефектів прозорості мають бути скінченними, а кожна координата – залишатися в межах абсолютного значення 1,000,000,000; імпорти поза цим обмеженим координатним профілем завершуються помилкою до реєстрації груп чи масок
Невдалі імпорти відкочують згенеровані об'єкти, вбудовані текстові Form, записи реєстру та стан версії й кольорів пристрою, тож викликач може повторно використати той самий документ і зберегти охоплюючу транзакцію графа
Скрипти, обробники подій, DTD, foreignObject, непідтримувані media-типи даних, JavaScript-URL та зовнішні URL замальовування чи ресурсів зображень відхиляються (fail closed)
Посилання на фрагменти, як-от url(#gradient), url(#clip) і href="#symbol", залишаються в межах проаналізованого документа й ніколи не викликають доступ до файлів чи мережі
Статистика
Структура THPDFSVGImportStatistics звітує про вузли, CSS-правила, градієнти, градієнтні обводки, маски, зображення, посилання, текстові фрагменти, ізольовані групи прозорості через GroupCount та об'єднані згенеровані байти операторів основного вмісту, pattern, масок і груп
Функція HPDFBuildSVGFormData окремо надає обмежений аналізатор через структури THPDFSVGFormData та THPDFSVGLinkInfo для тих, кому до реєстрації потрібні Form-вміст, власні розміри, ресурси прозорості, корисні навантаження зображень, потоки патернів і масок, імена текстових ресурсів чи метадані посилань; Groups надає потоки операторів ізольованих груп та консервативні межі Form
Приклад
Document.BeginDoc;
FormName := Document.ImportSVGFormXObject(SVGBytes, Statistics);
if FormName = '' then
raise Exception.Create('SVG import failed');
Document.CurrentPage.DrawSVGFormXObject(
FormName,
36,
72,
240,
120,
True
);
Document.CurrentPage.DrawSVGFormXObject(
FormName,
320,
72,
120,
60,
False
);
Див. також: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, Імпорт HTML5 Paged-Media