Імпорт 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
);

Векторний профіль

Текстові межі та межі замальовування

Текст підтримує суцільну заливку, жирний і курсивний варіанти, розмір шрифту, перетворення, прив'язку, прозорість та геометричне відсікання; градієнтна заливка тексту завершується помилкою, а кожен вузол 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