【问题标题】:Create multi-page pdf from one svg file从一个 svg 文件创建多页 pdf
【发布时间】:2017-02-22 16:42:34
【问题描述】:

有没有一种方法可以从一个 svg 文件创建多页 pdf?我目前正在加载一个已分成两个面板的 svg 文件。然后我隐藏一个面板,以便用户只能看到一个。然后通过列为面板 1 和面板 2 的选项卡,用户可以单击以一次查看一个面板并显示 CSS。用户能够向面板添加文本。然后,用户可以打印到 pdf。 svg 通过表单数据发送到一个脚本,该脚本调用一些 java 类(如 Batik)来创建 pdf。除了创建多页 pdf 之外,上述所有方法都可以正常工作。我不知道如何做到这一点。我对此很陌生。

SVG 文件:

<svg id="svgroot" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" height="100%" width="100%" viewBox="0 0 1638 1029.6" baseProfile="full" xmlns:space="preserve">    
<svg id="panel_1" width="1600" height="1024" overflow="visible">
    <g id="menupanel_1" style="display:inline">                 

        <image enable-background="new" width="1600" height="1024" xlink:href="images/Panel1.jpg" transform="matrix(1.0239 0 0 1.0021 -4.882813e-004 0)"></image>

        <a xlink:href="#" id="sec_" class="a-map" alt="Salads &amp; Soups"><rect x="8" y="259" fill-opacity="0" width="305.001" height="348"/></a>
        <a xlink:href="#" id="sec_" class="a-map" alt="Desserts"><rect x="333" y="486" fill-opacity="0" width="297" height="169"/></a>
        <a xlink:href="#" id="sec_" class="a-map" alt="Sandwiches"><rect x="6" y="673" fill-opacity="0" width="306.001" height="247"/></a>              
        <a xlink:href="#" id="imgsec_1" class="a-map" alt="Menu Panel Images">
            <rect  x="333.667" y="202.333" fill-opacity="0" width="294.911" height="273.911"/>
            <image id="image_1" enable-background="new" style="display:none" width="285" height="262" xlink:href="images/image1.png" transform="matrix(1.0057 0 0 1.0082 337.4297 207.7466)"></image>                               
            <image id="image_2" enable-background="new" style="display:none" width="285" height="262" xlink:href="images/image2.png" transform="matrix(1.0057 0 0 1.0082 337.4297 207.7466)"></image>
        </a>
        <g>
            <g><rect x="271.244" y="299.911" fill="#FFFFFF" width="34" height="12"/></g>
            <text id="price1" transform="matrix(0.9964 0 0 1 274 309.5898)" fill="#231F20" font-family="TradeGothicLTStd-Light" font-size="11">00.00</text>
        </g>
        <g>
            <g><rect x="271.244" y="343.244" fill="#FFFFFF" width="34" height="12"/></g>
            <text id="price2" transform="matrix(0.9964 0 0 1 274 352.9233)" fill="#231F20" font-family="TradeGothicLTStd-Light" font-size="11">00.00</text>
        </g>
        <g>
            <g><rect x="270.91" y="410.577" fill="#FFFFFF" width="34" height="12"/></g>
            <text id="price3" transform="matrix(0.9964 0 0 1 274 420.2563)" fill="#231F20" font-family="TradeGothicLTStd-Light" font-size="11">00.00</text>
        </g>
    </g>
</svg>

<svg id="panel_2" width="1638" height="1029.6" overflow="visible">
    <g id="menupanel_2" style="display:none">

        <image enable-background="new" width="1638" height="988" xlink:href="images/Panel2.jpg" transform="matrix(1 0 0 1.0421 0 0.002)"></image>

        <a xlink:href="#" id="sec_" class="a-map" alt="White Wine"><rect x="27" y="404" fill-opacity="0" width="302" height="246"/></a>
        <a xlink:href="#" id="sec_" class="a-map" alt="Red Wine"><rect x="28" y="658" fill-opacity="0" width="300" height="342"/></a>
        <a xlink:href="#" id="sec_" class="a-map" alt="Appetizers"><rect x="661" y="419" fill-opacity="0" width="312" height="563"/></a>
        <a xlink:href="#" id="sec_" class="a-map" alt="Burgers"><rect x="986" y="718" fill-opacity="0" width="628" height="253"/></a>
        <a xlink:href="#" id="sec_" class="a-map" alt="Mains"><rect x="985.5" y="17.3" fill-opacity="0" width="627" height="693"/></a>
        <a xlink:href="#" id="sec_" class="a-map" alt="Beers"><rect x="27.5" y="19.3" fill-opacity="0" width="303" height="343"/></a>
    </g>            
</svg>

脚本:

<cfscript>
svgformdata = form.data;
fname = form.filename;

transcoder = createObject("java", "org.apache.fop.svg.PDFTranscoder").init();

// load text into a reader and create the source input
svgText = '#svgformdata#';

reader = createObject("java", "java.io.StringReader").init(svgText);
input = createObject("java", "org.apache.batik.transcoder.TranscoderInput").init(reader);

// create a unique file name
outPath = ExpandPath("./pdf/" & fname);

fos = createObject("java", "java.io.FileOutputStream").init(outPath); 
output = createObject("java", "org.apache.batik.transcoder.TranscoderOutput").init(fos);

transcoder.transcode(input, output);

fos.close();
</cfscript>

【问题讨论】:

    标签: javascript java pdf svg


    【解决方案1】:

    我记得从 SVG 1.2 版本中删除多页 SVG 的提议,我认为 SVG 2.0 也不会拥有它。

    但是,您可以使用 XPath 或其他方法来使用 SVG,您必须创建两个 SVG 文件,每个文件只包含一个面板。然后创建您的多页 PDF。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2020-07-20
      • 2020-10-30
      • 2015-04-19
      • 2010-09-23
      • 1970-01-01
      相关资源
      最近更新 更多