Автоматически помещайте множество SVG в один PDF-файл, каждый на одной странице

Я хочу сделать доступными около 2000 графических изображений (смайлики) для латекса пользователей. Все они находятся в отдельных файлах SVG (около 1–10 КБ) с изначально квадратным соотношением сторон, но также есть автоматически сгенерированный файл спрайт лист, содержащий их все как <symbol>s. Поскольку само число превышает некоторые ограничения (например, предварительный просмотр Github ограничен 1000), а небольшой размер файла тратит много места в файловых системах с большим размером блока, а также потенциально требует много сетевых запросов (например, HTTP 1.x), Я думаю поместить их в один файл PDF в виде отдельных страниц. Соответствующие пакеты Latex поддерживают добавление определенных страниц из PDF-файлов в качестве графики, но я не нашел способа (пока) использовать SVG символы. Поэтому в настоящее время я предпочитаю решение в формате PDF. Однако, хотя я знаю, как преобразовать один SVG в одностраничный PDF, например. грамм. используя Inkscape, я не уверен, какие программы использовать для создания небольшого, быстрого и переносимого (например, на основе npm) сценария для создания одного многостраничного PDF-файла либо из сотен файлов SVG, либо из одного спрайт-листа SVG. Любой совет? В идеале 4+ шестнадцатеричных цифры, из которых состоят имена файлов SVG, будут использоваться для сортировки и, возможно, маркировки страниц PDF.

Я не совсем уверен, что вы считаете быстрым, но если вы хотите автоматическое преобразование из svg во что-то, что может включать латекс, взгляните на пакет svg.

samcarter_is_at_topanswers.xyz 20.03.2019 11:24

Для требования «одно изображение на странице», возможно, стоит взглянуть на класс документа standalone. Например, в режиме tikz он ставит один tikzpicture на страницу, что-то подобное можно сделать и для svg.

samcarter_is_at_topanswers.xyz 20.03.2019 11:25
Создание фильтров для вашего сайта
Создание фильтров для вашего сайта
Фильтры - удобный инструмент в арсенале веб-дизайнера. Они позволяют изменять элементы на странице с помощью всего нескольких строк кода. Эти...
Анимация SVG-узоров без единой строки CSS
Анимация SVG-узоров без единой строки CSS
Недавно я работал над веб-проектом, который позволил мне поэкспериментировать с шаблонами SVG. С SVG очень приятно работать, как только вы получите...
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
D3.js - это обширная библиотека, используемая для привязки произвольных данных к объектной модели документа (DOM). Мы разберем основные варианты...
0
2
108
1

Ответы 1

Это вдохновлено подход, которое я использовал в другом ответе. Чтобы сделать визуализацию <symbol> видимой, вы можете использовать XSLT-преобразование, поместив каждую иконку в отдельный контейнер <svg> на HTML-странице. Затем распределите их на отдельные страницы с помощью правила CSS @media print. Таким образом, вы можете открыть файл в браузере и распечатать его в формате PDF оттуда.

Во-первых, вы должны добавить эту строку в начало вашего спрайт-листа:

<?xml-stylesheet type = "text/xsl" href = "sprites_paged.xslt" ?>

Упомянутый sprites_paged.xslt будет выглядеть так:

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
                xmlns = "http://www.w3.org/1999/xhtml"
                xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
                xmlns:svg = "http://www.w3.org/2000/svg"
                xmlns:xlink = "http://www.w3.org/1999/xlink">
  <xsl:template match = "/">
    <html>
      <head>
        <meta charset = "UTF-8"></meta>
        <style>
svg { display: none; }
/* icon sizes to your liking */
.icon { display: block; width: 1in; height: 1in; }
@media print {
  .icon { break-after: page; }
}
        </style>
      </head>
      <body>
        <xsl:copy>
          <xsl:copy-of select = "//svg:svg"/>
        </xsl:copy>
        <xsl:for-each select = "//svg:symbol">
          <svg class = "icon" xmlns = "http://www.w3.org/2000/svg">
            <xsl:attribute name = "viewBox"><xsl:value-of select = "@viewBox"/></xsl:attribute>
            <use>
              <xsl:attribute name = "xlink:href">#<xsl:value-of select = "@id"/></xsl:attribute>
            </use>
          </svg>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Другие вопросы по теме