9

I downloaded jspdf 1.2.60 to generate pdf containing text from my html table. One of the columns contains notes entered by user thus can be very large as a result of which text is running of the page.

On scouring I found this however the

var splitTitle = doc.splitTextToSize(reportTitle, 180);

is no more available in the api. (I looked into the jspdf.js file).

How do I solve this?

Any idea is appreciated.

Community
  • 1
  • 1
Hamza Ahmed
  • 1,571
  • 4
  • 18
  • 35
  • Why don't you use jspdf 1.2.61 instead ? – Lotus91 Sep 13 '16 at 10:37
  • Can you post the error msg you've gotten? – Saravanabalagi Ramachandran Sep 13 '16 at 16:43
  • @Lotus91 In their official site, they are offering to download 1.2.60, while **CDN**s give 1.2.61 currently, but this doesn't make huge diff for `splitTextToSize` – Saravanabalagi Ramachandran Sep 13 '16 at 16:53
  • Try this, it may help - http://stackoverflow.com/questions/25904440/jspdf-addhtml-multiple-canvas-page – Shaggy Sep 16 '16 at 09:29
  • Perhaps you can use minified version of the js from the dist folder : /jsPDF-1.2.60/dist/jspdf.min.js – Shaggy Sep 16 '16 at 09:55
  • Before I award the bounty I put on your question, can you confirm that one of the answers helped you solving the issue? Alternatively, if it did not solve the problem, adjust your question to add more detail, or maybe comment on the answers? – Jongware Sep 18 '16 at 04:04
  • @Hamza let us know if you have satisfied with any answer, If you have any other doubt/query then update your question, we will try to give you satisfactory reply. – Abhijeet Sep 18 '16 at 10:30
  • @Hamza: since I did not receive any feedback at all from you, I am going to assume Abhijeet's extensively written answer is the correct one and thus deserves my (huge!) bonus. Glad to be of help. – Jongware Sep 19 '16 at 14:41
  • Thanks @RadLexus. Glad to help – Abhijeet Sep 19 '16 at 14:43

4 Answers4

26

Below code will be useful for your problem. It will work perfectly for your requirement.

    var lMargin=15; //left margin in mm
    var rMargin=15; //right margin in mm
    var pdfInMM=210;  // width of A4 in mm
    function getPDF() {
 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));
 doc.text(lMargin,20,lines);
 doc.save('Generated.pdf');
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js"></script>
<button id="getPDF" onclick="getPDF()">Get PDF</button>

For splitTextToSize :

As you were saying doc.splitTextToSize(text,size) is not present in jspdf 1.2.60 api.

Reason : It doc.splitTextToSize(text,size) is present in jspdf 1.2.60 lib but not in jspdf.js. It is present in jspdf.debug.js and in its minified vesion jspdf.min.js. That's the reason you are not finding splitTextToSize in your jspdf.js. You were looking it in wrong file. You can replace your jspdf.js with jspdf.debug.js and your code will work perfectly.

jspdf.debug.js and jspdf.min.js are present in \jsPDF-master\dist location in api zip file.

Note : I have provided you code for splitting your long paragraph in multiple lines. Here I've split line after 180mm(210mm-15mm-15mm),If text goes beyond 180mm then text will be go in newline. You can change the parameters according to your use.

Below is screenshot for your reference which contains splitTextToSize function definition in jspdf.debug.js.

enter image description here Let me know if you need any help. Happy Coding...!

Abhijeet
  • 4,069
  • 1
  • 22
  • 38
  • I have changed the `var rMargin=150; //right margin in mm` from 15 , now column width is small , text should go to page 2 but its is not going, what ever amount of text could come is showing up and rest is lost, i want it to be continued to next page, can you help ? – user2828442 Jul 18 '17 at 12:56
  • @user2828442 Can you share one example. Not getting exactly what you are saying, what exactly you want (Create new question if you want) – Abhijeet Jul 21 '17 at 15:40
  • @Abhijeet I'm having the same issues. My PDF is limited to one page. See pen: https://codepen.io/gdeleon101/pen/eoBeOm Also, my image isn't showing up. – gdeleon101 Apr 17 '19 at 15:56
  • Hey @gdeleon101, You have set page size and new page according to your contents. Refer https://www.freakyjolly.com/jspdf-multipage-example-generate-multipage-pdf-using-single-canvas-of-html-document-using-jspdf both the problems you are facing – Abhijeet Apr 19 '19 at 07:52
4

It just works without any flaws. Proof:

function createPdf() {
 var doc = new jsPDF('p','in','letter')
 var loremipsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus id eros turpis. Vivamus tempor urna vitae sapien mollis molestie. Vestibulum in lectus non enim bibendum laoreet at at libero. Etiam malesuada erat sed sem blandit in varius orci porttitor. Sed at sapien urna. Fusce augue ipsum, molestie et adipiscing at, varius quis enim. Morbi sed magna est, vel vestibulum urna. Sed tempor ipsum vel mi pretium at elementum urna tempor. Nulla faucibus consectetur felis, elementum venenatis mi mollis gravida. Aliquam mi ante, accumsan eu tempus vitae, viverra quis justo.\n\nProin feugiat augue in augue rhoncus eu cursus tellus laoreet. Pellentesque eu sapien at diam porttitor venenatis nec vitae velit. Donec ultrices volutpat lectus eget vehicula. Nam eu erat mi, in pulvinar eros. Mauris viverra porta orci, et vehicula lectus sagittis id. Nullam at magna vitae nunc fringilla posuere. Duis volutpat malesuada ornare. Nulla in eros metus. Vivamus a posuere libero.'

        // This line works. Try generating PDF.
 lines = doc.splitTextToSize(loremipsum, 7.5)

 doc.text(0.5, 0.5, lines)
 doc.save('Test.pdf')
}
<!DOCTYPE html>
<html>
<head>
 <title>PDF Test</title>
</head>
<body>
 <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.60/jspdf.min.js"></script>
 <button onclick="createPdf()">Create PDF</button>
</body>
</html>

You can see the same results in the latest version 1.2.61 too. So, clearly, something else is causing the error.

EDIT: Here I've used in so here it wraps if text goes beyond 7.5in. If you're using a different unit, deal with it properly, or that may create problems

Saravanabalagi Ramachandran
  • 8,551
  • 11
  • 53
  • 102
1

function createPdf() {
 var doc = new jsPDF('p','in','letter')
 var loremipsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus id eros turpis. Vivamus tempor urna vitae sapien mollis molestie. Vestibulum in lectus non enim bibendum laoreet at at libero. Etiam malesuada erat sed sem blandit in varius orci porttitor. Sed at sapien urna. Fusce augue ipsum, molestie et adipiscing at, varius quis enim. Morbi sed magna est, vel vestibulum urna. Sed tempor ipsum vel mi pretium at elementum urna tempor. Nulla faucibus consectetur felis, elementum venenatis mi mollis gravida. Aliquam mi ante, accumsan eu tempus vitae, viverra quis justo.\n\nProin feugiat augue in augue rhoncus eu cursus tellus laoreet. Pellentesque eu sapien at diam porttitor venenatis nec vitae velit. Donec ultrices volutpat lectus eget vehicula. Nam eu erat mi, in pulvinar eros. Mauris viverra porta orci, et vehicula lectus sagittis id. Nullam at magna vitae nunc fringilla posuere. Duis volutpat malesuada ornare. Nulla in eros metus. Vivamus a posuere liberous id eros turpis. Vivamus tempor urna vitae sapien mollis molestie. Vestibulum in lectus non enim bibendum laoreet at at libero. Etiam malesuada erat sed sem blandit in varius orci porttitor. Sed at sapien urna. Fusce augue ipsum, molestie et adipiscing at, varius quis enim. Morbi sed magna est, vel vestibulum urna. Sed tempor ipsum vel mi pretium at elementum urna tempor. Nulla faucibus consectetur felis, elementum venenatis mi mollis gravida. Aliquam mi ante, accumsan eu tempus vitae, viverra quis justo.\n\nProin feugiat augue in augue rhoncus eu cursus tellus laoreet. Pellentesque eu sapien at diam porttitor venenatis nec vitae velit. Donec ultrices volutpat lectus eget vehicula. Nam eu erat mi, in pulvinar eros. Mauris viverra porta orci, et vehicula lectus sagittis id. Nullam at magna vitae nunc fringilla posuere. Duis volutpat malesuada ornare. Nulla in eros metus. Vivamus a posuere liberous id eros turpis. Vivamus tempor urna vitae sapien mollis molestie. Vestibulum in lectus non enim bibendum laoreet at at libero. Etiam malesuada erat sed sem blandit in varius orci porttitor. Sed at sapien urna. Fusce augue ipsum, molestie et adipiscing at, varius quis enim. Morbi sed magna est, vel vestibulum urna. Sed tempor ipsum vel mi pretium at elementum urna tempor. Nulla faucibus consectetur felis, elementum venenatis mi mollis gravida. Aliquam mi ante, accumsan eu tempus vitae, viverra quis justo.\n\nProin feugiat augue in augue rhoncus eu cursus tellus laoreet. Pellentesque eu sapien at diam porttitor venenatis nec vitae velit. Donec ultrices volutpat lectus eget vehicula. Nam eu erat mi, in pulvinar eros. Mauris viverra porta orci, et vehicula lectus sagittis id. Nullam at magna vitae nunc fringilla posuere. Duis volutpat malesuada ornare. Nulla in eros metus. Vivamus a posuere liberous id eros turpis. Vivamus tempor urna vitae sapien mollis molestie. Vestibulum in lectus non enim bibendum laoreet at at libero. Etiam malesuada erat sed sem blandit in varius orci porttitor. Sed at sapien urna. Fusce augue ipsum, molestie et adipiscing at, varius quis enim. Morbi sed magna est, vel vestibulum urna. Sed tempor ipsum vel mi pretium at elementum urna tempor. Nulla faucibus consectetur felis, elementum venenatis mi mollis gravida. Aliquam mi ante, accumsan eu tempus vitae, viverra quis justo.\n\nProin feugiat augue in augue rhoncus eu cursus tellus laoreet. Pellentesque eu sapien at diam porttitor venenatis nec vitae velit. Donec ultrices volutpat lectus eget vehicula. Nam eu erat mi, in pulvinar eros. Mauris viverra porta orci, et vehicula lectus sagittis id. Nullam at magna vitae nunc fringilla posuere. Duis volutpat malesuada ornare. Nulla in eros metus. Vivamus a posuere liberous id eros turpis. Vivamus tempor urna vitae sapien mollis molestie. Vestibulum in lectus non enim bibendum laoreet at at libero. Etiam malesuada erat sed sem blandit in varius orci porttitor. Sed at sapien urna. Fusce augue ipsum, molestie et adipiscing at, varius quis enim. Morbi sed magna est, vel vestibulum urna. Sed tempor ipsum vel mi pretium at elementum urna tempor. Nulla faucibus consectetur felis, elementum venenatis mi mollis gravida. Aliquam mi ante, accumsan eu tempus vitae, viverra quis justo.\n\nProin feugiat augue in augue rhoncus eu cursus tellus laoreet. Pellentesque eu sapien at diam porttitor venenatis nec vitae velit. Donec ultrices volutpat lectus eget vehicula. Nam eu erat mi, in pulvinar eros. Mauris viverra porta orci, et vehicula lectus sagittis id. Nullam at magna vitae nunc fringilla posuere. Duis volutpat malesuada ornare. Nulla in eros metus. Vivamus a posuere liberous id eros turpis. Vivamus tempor urna vitae sapien mollis molestie. Vestibulum in lectus non enim bibendum laoreet at at libero. Etiam malesuada erat sed sem blandit in varius orci porttitor. Sed at sapien urna. Fusce augue ipsum, molestie et adipiscing at, varius quis enim. Morbi sed magna est, vel vestibulum urna. Sed tempor ipsum vel mi pretium at elementum urna tempor. Nulla faucibus consectetur felis, elementum venenatis mi mollis gravida. Aliquam mi ante, accumsan eu tempus vitae, viverra quis justo.\n\nProin feugiat augue in augue rhoncus eu cursus tellus laoreet. Pellentesque eu sapien at diam porttitor venenatis nec vitae velit. Donec ultrices volutpat lectus eget vehicula. Nam eu erat mi, in pulvinar eros. Mauris viverra porta orci, et vehicula lectus sagittis id. Nullam at magna vitae nunc fringilla posuere. Duis volutpat malesuada ornare. Nulla in eros metus. Vivamus a posuere libero.'

        // This line works. Try generating PDF.
 lines = doc.splitTextToSize(loremipsum, 7.5)

 doc.text(0.5, 0.5, lines)
 doc.save('Test.pdf')
}
<!DOCTYPE html>
<html>
<head>
 <title>PDF Test</title>
</head>
<body>
 <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.60/jspdf.min.js"></script>
 <button onclick="createPdf()">Create PDF</button>
</body>
</html>
mukesh kumar
  • 580
  • 3
  • 14
0

This dynamic solution worked for me.

var para='JSPDF is the HTML5 client-side solution for generating PDFs. This is perfect for event tickets, reports, and certificates. Just include the JSPDF library in your <head>, generate your PDF using the many built-in functions';

var doc = new jsPDF(); 
var pageWidth = doc.internal.pageSize.width || doc.internal.pageSize.getWidth();
var ParaWidth=pageWidth*0.85; /* para width will 85% of the page width. */
var LeftMargin=(pageWidth-ParaWidth)/2;/* Left margin will be half of the remaining space*/
var TopMargin=30;/*According to your requirement*/
var lines = doc.splitTextToSize(para, ParaWidth);
doc.text(LeftMargin, TopMargin , lines);
doc.save('MyPage.pdf');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
garish
  • 637
  • 12
  • 14