diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a2417f..9926fc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## pdfkit changelog ### Unreleased + - Fix infinite loop when text is positioned after page right margin ### [v0.10.0] - 2019-06-06 diff --git a/lib/mixins/text.js b/lib/mixins/text.js index 3216a91..8c449b0 100644 --- a/lib/mixins/text.js +++ b/lib/mixins/text.js @@ -220,6 +220,7 @@ export default { if (result.width == null) { result.width = this.page.width - this.x - this.page.margins.right; } + result.width = Math.max(result.width, 0); } if (!result.columns) { diff --git a/tests/unit/text.spec.js b/tests/unit/text.spec.js new file mode 100644 index 0000000..f8902e9 --- /dev/null +++ b/tests/unit/text.spec.js @@ -0,0 +1,79 @@ +import PDFDocument from '../../lib/document'; +import { logData } from './helpers'; + +describe('Text', () => { + let document; + + beforeEach(() => { + document = new PDFDocument({ + info: { CreationDate: new Date(Date.UTC(2018, 1, 1)) }, + compress: false + }); + }); + + describe('text', () => { + test('with simple content', () => { + const docData = logData(document); + + const textStream = new Buffer( + `1 0 0 -1 0 792 cm +q +1 0 0 -1 0 792 cm +BT +1 0 0 1 72 711.384 Tm +/F1 12 Tf +[<73696d706c65207465> 30 <7874> 0] TJ +ET +Q +`, + 'binary' + ); + + document.text('simple text'); + document.end(); + + expect(docData).toContainChunk([ + `5 0 obj`, + `<< +/Length 116 +>>`, + `stream`, + textStream, + `\nendstream`, + `endobj` + ]); + }); + + test('with content ending after page right margin', () => { + const docData = logData(document); + + const textStream = new Buffer( + `1 0 0 -1 0 792 cm +q +1 0 0 -1 0 792 cm +BT +1 0 0 1 600 763.384 Tm +/F1 12 Tf +[<73696d706c65207465> 30 <7874> 0] TJ +ET +Q +`, + 'binary' + ); + + document.text('simple text', 600, 20); + document.end(); + + expect(docData).toContainChunk([ + `5 0 obj`, + `<< +/Length 117 +>>`, + `stream`, + textStream, + `\nendstream`, + `endobj` + ]); + }); + }); +});