Есть ли способ центрировать текст с помощью jsPDF?

Я пытаюсь создать простой PDF-документ с помощью javascript. Я нашел jsPDF, но я не понимаю, как центрировать текст. Возможно ли это?

7 ответов


Да, это возможно. Вы можете написать метод плагина jspdf для использования.

один пример:

    (function(API){
    API.myText = function(txt, options, x, y) {
        options = options ||{};
        /* Use the options align property to specify desired text alignment
         * Param x will be ignored if desired text alignment is 'center'.
         * Usage of options can easily extend the function to apply different text 
         * styles and sizes 
        */
        if( options.align == "center" ){
            // Get current font size
            var fontSize = this.internal.getFontSize();

            // Get page width
            var pageWidth = this.internal.pageSize.width;

            // Get the actual text's width
            /* You multiply the unit width of your string by your font size and divide
             * by the internal scale factor. The division is necessary
             * for the case where you use units other than 'pt' in the constructor
             * of jsPDF.
            */
            txtWidth = this.getStringUnitWidth(txt)*fontSize/this.internal.scaleFactor;

            // Calculate text's x coordinate
            x = ( pageWidth - txtWidth ) / 2;
        }

        // Draw text at x,y
        this.text(txt,x,y);
    }
})(jsPDF.API);

и вы используете его вот так

var doc = new jsPDF('p','in');
doc.text("Left aligned text",0.5,0.5);
doc.myText("Centered text",{align: "center"},0,1);

это работает в блокноте на Домашняя страница jsPdf:

var centeredText = function(text, y) {
    var textWidth = doc.getStringUnitWidth(text) * doc.internal.getFontSize() / doc.internal.scaleFactor;
    var textOffset = (doc.internal.pageSize.width - textWidth) / 2;
    doc.text(textOffset, y, text);
}

WootWoot, на случай, если вам нужно больше вариантов макета, вы также можете взглянуть на мой библиотека

Он поддерживает:

  • выравнивание текста, списки, поля
  • стиль (с наследованием стиля)
  • таблицы с автоматическими/фиксированными / звездообразными столбцами, автоматически повторяющимися заголовками, col / row spans
  • верхние и нижние колонтитулы страницы
  • внедрение шрифтов, и несколько других опций

Он работает на стороне клиента (чистый JS) или на стороне сервера (модуль npm)

посмотри детская площадка чтобы увидеть, что возможно

удачи


я обнаружил, что текущая версия jsPdf поддерживает параметр "align" с сигнатурой функции следующим образом:

API.text = function (text, x, y, flags, angle, align)

таким образом, следующее должно дать вам выровненный по центру текст:

doc.text('The text', doc.internal.pageSize.width, 50, null, null, 'center');

однако в текущий момент времени в библиотеке возникает ошибка, когда включен строгий режим, потому что отсутствует "var". Существует проблема и запрос pull для нее, но исправление не сделало этого в: https://github.com/MrRio/jsPDF/issues/575

кто бы это ни искал, однажды вы сможете использовать это, чтобы упростить центрирование текста.


У меня была та же проблема и многие другие при создании PDF-файлов (например, auto-pagebreak, total-pageCount). Поэтому я начал писать немного lib, который зависит от jsPDF, но дает вам много функций, которые вы знаете (форма HTML/CSS и jQuery). Вы можете найти его на GitHub. Я надеюсь, что это упрощает создание PDF-файлов... =)


на основе ответа @Tsilis у меня есть фрагмент плагина здесь https://gist.github.com/Purush0th/7fe8665bbb04482a0d80 который может выровнять текст левый, правый и центр в заданной ширине текстового контейнера.

(function (api, $) {
'use strict';
api.writeText = function (x, y, text, options) {
    options = options || {};

    var defaults = {
        align: 'left',
        width: this.internal.pageSize.width
    }

    var settings = $.extend({}, defaults, options);

    // Get current font size
    var fontSize = this.internal.getFontSize();

    // Get the actual text's width
    /* You multiply the unit width of your string by your font size and divide
     * by the internal scale factor. The division is necessary
     * for the case where you use units other than 'pt' in the constructor
     * of jsPDF.
    */
    var txtWidth = this.getStringUnitWidth(text) * fontSize / this.internal.scaleFactor;

    if (settings.align === 'center')
        x += (settings.width - txtWidth) / 2;
    else if (settings.align === 'right')
        x += (settings.width - txtWidth);

    //default is 'left' alignment
    this.text(text, x, y);

}
})(jsPDF.API, jQuery);

использование

var doc = new jsPDF('p', 'pt', 'a4');
//Alignment based on page width
doc.writeText(0, 40 ,'align - center ', { align: 'center' });
doc.writeText(0, 80 ,'align - right ', { align: 'right' });
//Alignment based on text container width
doc.writeText(0, 120 ,'align - center : inside container',{align:'center',width:100});

doc.текст (text, left, top,' center') может использоваться для центрирования текста. Он также может использоваться с массивом строк, но когда он используется с массивом, центр не работает правильно, поэтому я использовал его в цикле для каждого объекта в массиве.

var lMargin=15; //left margin in mm
var rMargin=15; //right margin in mm
var pdfInMM=210;  // width of A4 in mm
var pageCenter=pdfInMM/2;

var doc = new jsPDF("p","mm","a4");
var paragraph="Apple's iPhone 7 is officially upon us. After a week of pre-orders, the latest in the iPhone lineup officially launches today.\n\nEager Apple fans will be lining up out the door at Apple and carrier stores around the country to grab up the iPhone 7 and iPhone 7 Plus, while Android owners look on bemusedly.\n\nDuring the Apple Event last week, the tech giant revealed a number of big, positive changes coming to the iPhone 7. It's thinner. The camera is better. And, perhaps best of all, the iPhone 7 is finally water resistant.\n\nStill, while there may be plenty to like about the new iPhone, there's plenty more that's left us disappointed. Enough, at least, to make smartphone shoppers consider waiting until 2017, when Apple is reportedly going to let loose on all cylinders with an all-glass chassis design.";

var lines =doc.splitTextToSize(paragraph, (pdfInMM-lMargin-rMargin));
var dim = doc.getTextDimensions('Text');
var lineHeight = dim.h
for(var i=0;i<lines.length;i++){
  lineTop = (lineHeight/2)*i
  doc.text(lines[i],pageCenter,20+lineTop,'center'); //see this line
}
doc.save('Generated.pdf');