Align text right using jsPDF

前端 未结 1 1514
别跟我提以往
别跟我提以往 2021-01-05 03:16

I\'m using jsPDF to create a PDF on the client side and I see there are properties to change the color, size, and font of the text, but I need to align the text to the right

相关标签:
1条回答
  • 2021-01-05 03:33

    I have written an extension to jsPDF a while back that allows text aligning (and by default aligns top-left, instead of the random stuff jsPDF' .text function does).

    The code is written in TypeScript (to add some type annotations), which should give you a pretty clear idea what parameters there are.

    Update: These snippets have been corrected to work in the latest version as of 2019/07/17, thanks to Kaddath (see their comment/this post's edit history for details).

    var splitRegex = /\r\n|\r|\n/g;
    jsPDF.API.textEx = function (text: any, x: number, y: number, hAlign?: string, vAlign?: string) {
        var fontSize = this.internal.getFontSize()
            / this.internal.scaleFactor;
    
        // As defined in jsPDF source code
        var lineHeightProportion = 1.15;
    
        var splittedText: string[];
        var lineCount: number = 1;
        if (vAlign === 'middle' || vAlign === 'bottom'
            || hAlign === 'center' || hAlign === 'right') {
    
            splittedText = typeof text === 'string'
            ? text.split(splitRegex)
            : text;
    
            lineCount = splittedText.length || 1;
        }
    
        // Align the top
        y += fontSize * (2 - lineHeightProportion);
    
        if (vAlign === 'middle') y -= (lineCount / 2) * fontSize;
        else if (vAlign === 'bottom') y -= lineCount * fontSize;
    
    
        if (hAlign === 'center'
            || hAlign === 'right') {
    
            var alignSize = fontSize;
            if (hAlign === 'center') alignSize *= 0.5;
    
            if (lineCount > 1) {
                for (var iLine = 0; iLine < splittedText.length; iLine++) {
                    this.text(splittedText[iLine],
                        x - this.getStringUnitWidth(splittedText[iLine]) * alignSize,
                        y);
                    y += fontSize * lineHeightProportion;
                }
                return this;
            }
            x -= this.getStringUnitWidth(text) * alignSize;
        }
    
        this.text(text, x, y);
        return this;
    };
    

    Plain javascript:

    var splitRegex = /\r\n|\r|\n/g;
    jsPDF.API.textEx = function (text, x, y, hAlign, vAlign) {
        var fontSize = this.internal.getFontSize() / this.internal.scaleFactor;
    
        // As defined in jsPDF source code
        var lineHeightProportion = 1.15;
    
        var splittedText = null;
        var lineCount = 1;
        if (vAlign === 'middle' || vAlign === 'bottom' || hAlign === 'center' || hAlign === 'right') {
            splittedText = typeof text === 'string' ? text.split(splitRegex) : text;
    
            lineCount = splittedText.length || 1;
        }
    
        // Align the top
        y += fontSize * (2 - lineHeightProportion);
    
        if (vAlign === 'middle')
            y -= (lineCount / 2) * fontSize;
        else if (vAlign === 'bottom')
            y -= lineCount * fontSize;
    
        if (hAlign === 'center' || hAlign === 'right') {
            var alignSize = fontSize;
            if (hAlign === 'center')
                alignSize *= 0.5;
    
            if (lineCount > 1) {
                for (var iLine = 0; iLine < splittedText.length; iLine++) {
                    this.text(splittedText[iLine], x - this.getStringUnitWidth(splittedText[iLine]) * alignSize, y);
                    y += fontSize * lineHeightProportion;
                }
                return this;
            }
            x -= this.getStringUnitWidth(text) * alignSize;
        }
    
        this.text(text, x, y);
        return this;
    };
    

    Using it is as simple as:

    pdf.textEx('Example text', xPosition, yPosition, 'right', 'middle');
    

    Prints a text of which the middle right is at (xPosition, yPosition).

    0 讨论(0)
提交回复
热议问题