自动将许多SVG放入单个PDF中,每个都放在一个页面上

时间:2019-03-20 09:15:26

标签: svg npm latex pdf-generation

我想提供约2000个图形(emojis) for Latex用户。它们最初都在单独的SVG文件(约1–10 KB)中,具有长宽比,但也有一个自动生成的 spritesheet ,它们全部包含为<symbol>。由于绝对数量超出了某些限制(例如,Github预览版限制为1000个),并且小文件大小浪费了块大小较大的文件系统上的大量空间,并且还潜在地需要大量网络请求(例如HTTP 1.x),我考虑将它们作为单个页面放入一个PDF文件中。各自的Latex软件包支持将PDF中的特定页面添加为图形,但是我还没有找到一种方法来利用SVG 符号。因此,我目前更喜欢PDF解决方案。但是,虽然我知道如何将单个SVG转换为单页PDF,但是G。使用Inkscape,我不确定要使用哪些程序来创建小型,快速且可移植的(例如,基于npm的)脚本,以从数百个SVG文件或单个SVG子表格中制​​作单个多页PDF。有什么建议吗?理想情况下,将使用SVG文件名所包含的4个以上的十六进制数字来对PDF页面进行排序,甚至可以对它们进行标记。

1 个答案:

答案 0 :(得分:1)

这是受我在另一个答案中使用的an approach的启发。要使<symbol>可见,可以使用XSLT转换,将每个图标放在HTML页面上的单独<svg>容器中。然后使用CSS @media print规则将它们分发到单独的页面上。这样,您可以在浏览器中打开文件,然后从那里将其打印为pdf。

首先,您需要将此行添加到Spritesheet的开头:

<?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>