Javascript 在PDF中的SVG元素中嵌入属性

Javascript 在PDF中的SVG元素中嵌入属性,javascript,node.js,pdf,svg,Javascript,Node.js,Pdf,Svg,我正在和一位客户一起工作,他经营着一家使用专有软件的招牌制作公司。我正在开发一个自定义的基于SVG的工具,我们将在服务器端导出该工具,并使用I-Cut进行工作,它获取一个图像和一个向量来创建一个带有面的标志。i-Cut采用PDF格式,因此我一直在寻找使用基于节点的解决方案将SVG文件导出为PDF的不同解决方案(我已经尝试过了,到目前为止,我已经能够将矢量和图像相互叠加导出为PDF格式,可以在FlexSign/i-Cut中打开) 然而,为了让客户快速创建标志,它需要传入一个“DieColor”颜色

我正在和一位客户一起工作,他经营着一家使用专有软件的招牌制作公司。我正在开发一个自定义的基于SVG的工具,我们将在服务器端导出该工具,并使用I-Cut进行工作,它获取一个图像和一个向量来创建一个带有面的标志。i-Cut采用PDF格式,因此我一直在寻找使用基于节点的解决方案将SVG文件导出为PDF的不同解决方案(我已经尝试过了,到目前为止,我已经能够将矢量和图像相互叠加导出为PDF格式,可以在FlexSign/i-Cut中打开)

然而,为了让客户快速创建标志,它需要传入一个“DieColor”颜色名称属性,但这有点模糊,我不完全确定这在专有软件Land中意味着什么。当使用正确的属性导入/导出文件时,FlexiSign程序的“颜色规格”中应该是这样的:

对于我的PDF,该框缺少属性(尽管我传递的洋红填充颜色有效):

所以问题是,我如何才能将任何属性导出为PDF格式?必须能够嵌入某种元数据,但我不熟悉PDF格式或如何与之交互,或者什么库可以完成这项工作。是否有更好的支持PHP库我可以使用?我也在研究使用的可能性。eps,因为显然i-Cut可以使用它

我最近还发现了以下链接:

这与声明一个PDF颜色空间有关,但我对它的工作原理一无所知——这和它有什么关系吗


任何帮助都将不胜感激。谢谢!

在我看来,SVG当前标准不支持专色声明,您需要定制和/或昂贵的SVG>PDF转换工具将命名的SVG颜色转换为PDF中的专色。如果您选择的工具和生成的PDF的唯一问题是它们没有专色,您可以ost处理PDF。假设RGB洋红不用于任何其他用途

$ perl -Mstrict -MCAM::PDF -we '
> sub _n { CAM::PDF::Node->new(@_) }
> @ARGV and my $doc = CAM::PDF->new($ARGV[0]) or die();
> my $r = $doc->getValue($doc->getPage(1)->{Resources});
> $r->{ColorSpace} ||= _n("dictionary", {});
> $doc->getValue($r->{ColorSpace})->{DieLine} = _n("array", [
>     (map {_n("label", $_)} qw(Separation DieLine DeviceCMYK)),
>     _n("reference", $doc->appendObject(undef, 
>         _n("object", _n("dictionary", {
>             FunctionType => _n("number", 2),
>             Domain => _n("array", [map{_n("number", $_)} (0,1)]),
>             C0 => _n("array", [map {_n("number", $_)} (0,0,0,0)]),
>             C1 => _n("array", [map {_n("number", $_)} (0,0.5,1,0.2)]),
>             N => _n("number", 1),
>         })),
>     ,0)),
> ]);
> my $s = $doc->getPageContent(1);
> $s =~ s!(?<=\s)1\s0\s1\srg(?=\s)!/DieLine cs 1 sc!g;
> $doc->setPageContent(1, $s);
> $ARGV[0] =~ s/(.pdf)$/+$1/;
> $doc->cleanoutput($ARGV[0]);
> ' test.pdf
$perl-Mstrict-MCAM::PDF-我们
>子{CAM::PDF::Node->new(@)}
>@ARGV和my$doc=CAM::PDF->new($ARGV[0])或die();
>my$r=$doc->getValue($doc->getPage(1)->{Resources});
>$r->{ColorSpace}| |=_n(“字典,{});
>$doc->getValue($r->{ColorSpace})->{DieLine}=\n(“数组”[
>(图{u n(“标签”,美元)}qw(分离模线设备cmyk)),
>_n(“参考”,$doc->appendObject(未定义),
>“对象”,“字典”{
>FunctionType=>\n(“数字”,2),
>Domain=>\n(“数组”,[map{\n(“数字”,$)}(0,1)],
>C0=>n(“数组”,“映射{n(“数字”,“元”)}(0,0,0,0)]),
>C1=>n(“数组”,[map{n(“数字”,$)}(0,0.5,1,0.2)],
>N=>\u N(“数字”,1),
>         })),
>     ,0)),
> ]);
>my$s=$doc->getPageContent(1);
>$s=~s!(?$doc->setPageContent(1$s);
>$ARGV[0]=~s/(.pdf)$/+1/;
>$doc->cleanpoutput($ARGV[0]);
>'test.pdf

生成的
test+.pdf
应该有
DieLine
专色(或多或少的橙色,如示例中所示)来代替255-0-255填充形状。

我认为另一个问题的答案也可能解决您的问题。Perl远远超出了我的能力(现在)但乍一看,这看起来棒极了。我已经找到了解决客户问题的替代方案,但我接受了你写这篇文章的工作。谢谢!