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

时间:2013-11-26 22:57:28

标签: javascript node.js pdf svg

我正在与运营使用专有软件的签名制作业务的客户合作 - FlexiSIGN-PROi-Cut。我正在开发一个基于SVG的自定义工具,我们将在服务器端导出并与i-Cut一起工作,它采用图像和矢量来创建一个带有面部的标记。 i-Cut需要PDF,所以我一直在寻找使用基于节点的解决方案从SVG文件导出到PDF的不同解决方案(我已经尝试过PDFKitscreen capturing with PhantomJS。我已经完成了工作,我可以将矢量和图像相互叠加到PDF中,可以在FlexiSIGN / i-Cut中打开。

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

使用我的PDF,该框缺少属性(虽然我传入的洋红色填充颜色正在工作):

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

我最近也发现了这个链接:SVG spot color and cut lines

这与声明PDF色彩空间有关,但我完全不知道它是如何工作的 - 它是否与SVG ColorProfileElement有关?

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

正如我所看到的,SVG当前标准不支持专色声明,您需要定制和/或昂贵的SVG> PDF转换工具,用于将命名的SVG颜色转换为PDF中的专色。如果您选择的工具和PDF产生的唯一问题是它们没有专色,您可以对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

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