【问题标题】:PDF Creation with an SVG with curved text in PHP - no text is shown在 PHP 中使用带有弯曲文本的 SVG 创建 PDF - 不显示文本
【发布时间】:2015-06-16 07:26:09
【问题描述】:

我现在正在处理一个项目,该项目需要我渲染一个 PDF,其中包括一个带有弯曲文本的 SVG。

需要以这种方式创建文本,因为它必须支持多种语言并且其中包含变量。

到目前为止,我已经按照我想要的方式呈现了 PDF,除了弯曲的文本,它会被忽略。

这是我尝试渲染的 SVG:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" height="1024px" width="1280px" id="mainSVG">
    <defs>
        <path d="m250,250 a10,10 0 0 0 350,250" id="curvedTextPath"></path>
        <path d="m250,250 a10,10 0 0 1 350,250" id="curvedTextPath2"></path>
</defs>
    <circle style="fill: blue;" cx="425px" cy="375px" r="250" id="mainCircle"></circle>
    <text>
        <textPath startOffset="55%" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#curvedTextPath">Some test text that is longer</textPath>
        <textPath startOffset="22.5%" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#curvedTextPath2">Smaller text here</textPath>
    </text>
</svg>

我尝试使用 Imagick 转换 SVG,它只给了我没有文字的圆圈:

    <?php
    $svg = file_get_contents("/path/to/test.svg");
    $image = new Imagick();
    $image->readImageBlob($svg);
    $image->setImageFormat("png");
    $image->writeImage("/path/to/lobster.png");
    ?>

ImageMagick 命令“convert”和 TCPDF 的“imageSVG”函数也是如此:

require_once('./tcpdf/tcpdf_import.php');
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->setCreator(PDF_CREATOR);
$pdf->setAuthor('Test');
$pdf->setTitle('Curvetest');
$pdf->setSubject('Testing of the Curve');
$pdf->addPage();
$pdf->imageSVG($file = './test.svg', $x = 15, $y = 30, $w = '', $h = '');
$filepath = '/path/to/test.pdf';
$pdf->Output($filepath, 'F');

我现在没有想法,我读到 ImageMagick 在转换时会忽略 textPath,但如果安装了 libRSVG,它应该可以工作......好吧,它是,但它仍然不起作用。

  • 有人知道如何处理这个问题吗?
  • 也许我还没有想到另一种方法?

【问题讨论】:

  • 顺便说一下,路径标签中的值有点奇怪,因为我们今天下午玩弄了一些数字来弄清楚路径标签是如何工作的
  • 我刚刚尝试使用inkscape。它在实际显示文本路径上的文本时效果更好,但不能正确读取文本路径。两个文本中只有一个显示在完全不同的位置,向后且字母间距更大。
  • 您找到解决此问题的方法了吗?我现在也一样
  • 我做到了,实际上我不得不用 javascript 来做,我找到了一个预先存在的脚本,希望这有助于解决您的问题:github.com/codrops/Arctext

标签: php pdf svg imagemagick imagemagick-convert


【解决方案1】:

您也可以从命令行使用 inkscape。然后它甚至不会启动 GUI。

以下命令会将您的 SVG 转换为 PDF:

inkscape          \
 --without-gui    \
 --file=input.svg \
 --export-pdf out.pdf

下面的截图来自转换为 PDF 后引用的 SVG 源(在 OP 中):

要查看更多可能对 inkscape 命令有用的参数,请参阅 inkscape --help

更新

顺便说一句,my 版本的 ImageMagick(OSX Mavericks 上的 MacPorts 版本)将 SVG 转换为 PDF 没有问题:

$ convert -version

  Version: ImageMagick 6.9.0-0 Q16 x86_64 2014-12-06 http://www.imagemagick.org
  Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
  Features: DPC Modules
  Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib gvc jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib


convert input.svg out2.pdf

这是生成的 PDF 屏幕截图:

【讨论】:

  • 库尔特您好,感谢您的回复!你从 inkscape 和 imagick 得到的 PDF 正是我得到的那个,在它们两个中,文本完全不合适。它应该在圆圈的底部,在里面。我不知道是什么导致了这个问题,到现在为止,我正在尝试用 CSS3 或 SASS 来做这个,这可能很有趣 x)
  • @PhilippT.:然后检查您的 SVG 代码。对我来说,PDF 输出看起来与 Inkscape 渲染的 SVG 完全一样:文本字符串在圆圈外,而不是在圆圈内。
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 2019-12-15
  • 2011-07-08
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
相关资源
最近更新 更多