Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用蜡染从SVG到PNG:多行文本的问题_Java_Svg_Batik - Fatal编程技术网

Java 使用蜡染从SVG到PNG:多行文本的问题

Java 使用蜡染从SVG到PNG:多行文本的问题,java,svg,batik,Java,Svg,Batik,我正在使用蜡染将SVG转换为PNG图像,但多行文字的渲染不正确。以一种不确定的方式,文本本身可能不再以最终图像为中心 作为例子,考虑开始SVG的这部分: 这是正确的渲染,我也希望在PNG中获得。顺便说一下,生成的PNG如下所示: 如您所见,顶部绿色框中的文本不再居中 这是SVG的一部分,它定义了这一点(由于怀疑存在字体问题,我还尝试删除了所有font-family=“”,但没有效果): 然后,使用返回的字节[]: if (pngBytes != null) { BufferedImag

我正在使用蜡染将SVG转换为PNG图像,但多行文字的渲染不正确。以一种不确定的方式,文本本身可能不再以最终图像为中心

作为例子,考虑开始SVG的这部分:

这是正确的渲染,我也希望在PNG中获得。顺便说一下,生成的PNG如下所示:

如您所见,顶部绿色框中的文本不再居中

这是SVG的一部分,它定义了这一点(由于怀疑存在字体问题,我还尝试删除了所有
font-family=“”
,但没有效果):

然后,使用返回的字节[]:

if (pngBytes != null) {
   BufferedImage final_img = ImageIO.read(new ByteArrayInputStream(pngBytes));
   File output_file = new File(imagepath);
   ImageIO.write(final_img, "png", output_file);
}

非常感谢您提供的任何见解。

我下载了您的svg,文件(至少在我的计算机上)与绿色框的范围内的文本不太匹配(有一点溢出,被剪裁)。我不确定这是否是平台问题,因为您的屏幕截图显示的文本带有一点边距(而在我的例子中,使用GIMP打开时,文本超出了范围)

因此,我修改了svg,使所有10px的字体大小都减少到9px(以适应正方形中的所有内容)

然后,我使用java-8-openjdk-amd64、提供的svg和以下依赖项运行了您的代码:

compile group: 'org.apache.xmlgraphics', name: 'batik-transcoder', version: '1.9.1'
compile group: 'org.apache.xmlgraphics', name: 'xmlgraphics-commons', version: '2.2'
compile group: 'org.apache.xmlgraphics', name: 'batik-codec', version: '1.9.1'
TEST1
框在我的png中呈现出与您的png相似但不完全相同的效果:

A simple activity, with
  a text that goes on t
然后我修改了xml节点,将第二行从“在t上的文本”更改为“在t上的文本”。这一次,第二条线居中

A simple activity, with
     a text that
然后,我将原始文本放回节点,并将框的字体系列更改为
Lucida Sans
,大小更改为7px(我在下面修改的节点)


一项简单的活动,包括
在t上的文本

这次是在中央。你试过什么?如果您尝试上述方法(更改字体大小和/或字体系列),您会得到什么结果?我还使用1000px作为
键宽度
转码提示,如果这可能会改变您的情况。

经过一段时间,我终于找到了真正的问题,这要感谢上的一篇文章。在
t平移
”文本中的尾随和结尾空格会导致蜡染光栅化器误解内容

通过扫描tspan元素并设置文本的修剪版本:

for (int tspanCounter = 0; tspanCounter < tspanList.getLength(); tspanCounter++) {
   Node tspan = tspanList.item(tspanCounter);
   tspan.setTextContent(actParts[tspanCounter].trim());
}
for(int-tspanCounter=0;tspanCounter
我得到了正确的结果。在下面的图像中,您可以看到使用和不使用简单的
trim()
调用的结果

版本错误(tspan内容中的空白)

“右”版本(tspan内容中的空白部分已修剪)


@Andreaジーティーオー 我无法重现这个问题。我正在使用1.9.1org.apache.xmlgraphics蜡染所有1.9.1pom@EzekielBaniaga:非常感谢您的尝试,非常感谢。作为对DaveJarvis的回应,我正在使用Java1.6、batik-all-1.7.jar进行编译;我不知道哪个工具生成SVG;我从另一个团队收到它,以便将其与ApachePOI一起放入PDF。嗨,William,谢谢,非常感谢。可能在您的计算机上,文本以不同的方式呈现,因为缺少Kievit Pro字体。即使在我的例子中,最终呈现也有点不同,并且在转换过程中似乎丢失了该字体(如我问题的第二幅图像:这是生成的png,用ApachePOI放入pdf中)。因此,如果我理解正确,你的建议是用大量替换来减小字体大小。我试着让你知道。可能Batik遇到的文本对于其容器来说太长,并且在呈现时出现问题。您好,是的,我建议尝试不同的
字体系列
和/或
字体大小
值。我相应地更新了答案。这有点偶然,因为我无法重现您的确切起始条件,但它似乎是库中的一个渲染问题。我不确定Kevit Pro是哪种字体,但是Lucida Sans应该是“java友好的”。让我知道进展如何。是的,我不能确定,因为我不知道蜡染在引擎盖下做什么。但是,在转换之前操纵字体大小似乎可以解决这个问题。也许将文本放入一个不再“适合”它的容器中确实存在问题。我认为下一步将是在转换中保持字体系列。现在…非常感谢你(也感谢那些试图帮助你的人)!
A simple activity, with
     a text that
<text fill="rgb(255, 255, 255)" fill-opacity="1" font-family="Lucida Sans" font-size="7px" font-style="normal" font-weight="normal" text-anchor="middle" transform="translate(48 0.429996)">
    <tspan dy="1em" x="0">A simple activity, with</tspan>
    <tspan dy="1.5em" x="0">a text that goes on t</tspan>
</text>
for (int tspanCounter = 0; tspanCounter < tspanList.getLength(); tspanCounter++) {
   Node tspan = tspanList.item(tspanCounter);
   tspan.setTextContent(actParts[tspanCounter].trim());
}