javascript - 检测到 Canvas 元素在 Canvas 边界之外

标签 javascript php canvas svg fabricjs

我正在做一个项目,管理员可以在其中创建一个卡片模板,他们可以在其中插入占位符变量,例如 {first_name}{last_name} {website} 等。然后将通过让用户填写他们的名字、姓氏等来创建一张卡片。所以基本上占位符将被用户提供的实际内容所取代。为此,我根据管理员创建的模板创建了一个 SVG 图像,并将这些占位符变量替换为服务器端的用户数据。

问题是,如果用户提供的内容太长,那么它可能会超出 Canvas 边界,因此在打印实际卡片时可能会被 chop 。

是否有某种方法可以检测到,在替换占位符后, Canvas 元素延伸到了 Canvas 边界之外?如果是这样,有没有办法找到那个元素并让它缩小直到它适合边界?基本上,我想要类似 this 的东西但在服务器端。

这是我用来生成 SVG 图像的一些示例代码:

$message_string = array('{first_name}','{last_name}');
$replace_string = array('Fist Name of User','Last Name Of User');
$front_svg_url = $svg_url.$res_code[0]['front_side_svg_image'];
$front_raw_svg = file_get_contents($front_svg_url);
$front_side_svg = str_ireplace($message_string, $replace_string, $front_raw_svg);
$file_name = uniqid($prefix).".svg";
$file_handle = fopen("$folder_name/".$file_name, 'w');
fwrite($file_handle, $front_side_svg);
fclose($file_handle);

在服务器端,我只是替换变量,所以我不确定如何在服务器上实现这一点。我愿意接受任何可以实现我预期输出的想法。

最佳答案

您可以使用 PHP 函数 imageftfbox (应启用 GD 库)。

它返回坐标数组 [x0,y0, x1,y1, x2,y2, x3,y3]。

根据它们,您可以确定它是否超出了您的 SVG 元素放置范围,这是您如何执行此操作的示例:

function cutStringToPix($str, $svgWidth, $fontSize = 14, $font='times_new_roman.ttf', $delimiter = '') 
  $font = './fonts/' .$font;
  $sWidth = $svgWidth;
  $newStr = $str;
  $words = $delimiter
     ? explode($delimiter, $str)
     : str_split($str);
  $wordsCnt = count($words);

  // Reduce your string until it fits
  for (;$sWidth >= $svgWidth && $wordsCnt; $wordsCnt--) {
    $newStr = implode(' ', array_slice($words, 0, $wordsCnt));
    $bbox = imagettfbbox($fontSize, 0, $font, $newStr);
    $sWidth = $bbox[2] - $bbox[0];
  };
  return $newStr;
}
// Now use your $newStr

好的,那是你的 example来自评论

它使用TimesNewRoman 字体,你需要为它找到TTF (for instance this...)并将其保存在服务器上的“字体”目录中(相对于您希望存储“cutStringToPix”函数的 lib.php)作为“times_new_roman.ttf”

那么你的 SVG 形成部​​分将是这样的:

//include 'cutStringPix' func

$message_string = array('{first_name}','{last_name}');
$replace_string = array('Fist Name of User','Last Name Of User');
$front_svg_url = $svg_url.$res_code[0]['front_side_svg_image'];
$front_raw_svg = file_get_contents($front_svg_url);
//so what we adding:
$replace_string = cutStringToPix($replace_string, 162, 13);

$front_side_svg = str_ireplace($message_string, $replace_string, $front_raw_svg);
$file_name = uniqid($prefix).".svg";

关于javascript - 检测到 Canvas 元素在 Canvas 边界之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49235258/

相关文章:

html - Amazon S3 图像,无法使用 html5 Canvas 保存,出现 Tainted Canvases 错误

javascript - 你如何为这段 Javascript 代码设置背景图片的宽度?

javascript - 为什么 Axios get call 在基本设置下会返回 404 错误?

javascript - 将函数绑定(bind)到 baz 后调用 fn.apply(bar,[])

javascript - 如何动态更改 arc() 方法中的半径参数

c# - 使用 MVVM 将矩形添加到 Canvas

javascript - 如何将表格附加到DIV

php - aws php sdk - 函数可以在本地主机和控制台中运行,但在服务器上时不能在浏览器上运行

php - 如何在php中将页面重定向到https?

PHP PDO 无法获取 OUT 参数值