iText7.1.3将SVG添加到PdfDocument中

时间:2018-10-04 12:25:42

标签: java svg itext7

使用 iText 7.1.3 并尝试将SVG文件添加到PdfDocument 中,将给出以下输出:长度为1的文本未呈现。我发现可能是问题所在。 我请iText团队成员进行检查。

try {
      SvgConverter.drawOnCanvas(svgUrl.openStream(), pdfCanvas_, imageLlx, imageLly);
} catch (IOException e) {
      e.printStackTrace();
}

调试器调用:

processText:255, DefaultSvgProcessor (com.itextpdf.svg.processors.impl)
visit:212, DefaultSvgProcessor (com.itextpdf.svg.processors.impl)
visit:204, DefaultSvgProcessor (com.itextpdf.svg.processors.impl)
visit:204, DefaultSvgProcessor (com.itextpdf.svg.processors.impl)
executeDepthFirstTraversal:153, DefaultSvgProcessor (com.itextpdf.svg.processors.impl)
process:106, DefaultSvgProcessor (com.itextpdf.svg.processors.impl)
process:768, SvgConverter (com.itextpdf.svg.converter)
convertToXObject:555, SvgConverter (com.itextpdf.svg.converter)
convertToXObject:590, SvgConverter (com.itextpdf.svg.converter)
drawOnCanvas:380, SvgConverter (com.itextpdf.svg.converter)

在功能 processText 中,在 Trim尾随空格

的行中
trimmedText = SvgTextUtil.trimTrailingWhitespace("A");

对于 trimmedText = A (长度= 1),返回空字符串

/**
* Process the text contained in the text-node
*
* @param textNode node containing text to process
*/
private void processText(ITextNode textNode) {
    ISvgNodeRenderer parentRenderer = this.processorState.top();

    if (parentRenderer instanceof TextSvgNodeRenderer) {
        // when svg is parsed by jsoup it leaves all whitespace in text element as is. Meaning that
        // tab/space indented xml files will retain their tabs and spaces.
        // The following regex replaces all whitespace with a single space.
        //TODO(RND-906) evaluate regex and trim methods
        String trimmedText = textNode.wholeText().replaceAll("\\s+", " ");
        //Trim leading whitespace
        trimmedText = SvgTextUtil.trimLeadingWhitespace(trimmedText);
        //Trim trailing whitespace
        trimmedText = SvgTextUtil.trimTrailingWhitespace(trimmedText);
        parentRenderer.setAttribute(SvgConstants.Attributes.TEXT_CONTENT, trimmedText);
    }
}

1 个答案:

答案 0 :(得分:1)

您指出的trimTrailingWhitespace中确实存在一个错误

public static String trimTrailingWhitespace(String toTrim) {
    if(toTrim == null){
        return "";
    }
    int end = toTrim.length();
    if (end > 0) {
        int current = end - 1;
        while (current > 0) {
            char currentChar = toTrim.charAt(current);
            if (Character.isWhitespace(currentChar) && !(currentChar == '\n' || currentChar == '\r')) {
                //if the character is whitespace and not a newline, increase current
                current--;
            } else {
                break;
            }
        }
        if(current == 0){
            return "";
        }else {
            return toTrim.substring(0, current + 1);
        }
    }else{
        return toTrim;
    }
}

注释//if the character is whitespace and not a newline, increase current后跟current--;已表明,此方法是trimLeadingWhitespace的副本(同一注释后的行确实会增加 { {1}})已修改为可以在current参数的另一端使用。但是,不幸的是,该修改是不正确的:如果字符串在位置0处具有非空格字符,而后仅是空格,则错误地将其视为空。

解决方法是替换

String

作者

while (current > 0)

while (current >= 0)

作者

if(current == 0)

通过该修复程序

if(current < 0)
此外,不需要在if (end > 0) { [...] }else{ return toTrim; } 周围加上

框。并且[...]循环可以更紧凑地表示为while循环,例如像这样:

for