diff --git a/pitfall/pdfkit/lib/document.js b/pitfall/pdfkit/lib/document.js deleted file mode 100644 index 691a56f7..00000000 --- a/pitfall/pdfkit/lib/document.js +++ /dev/null @@ -1,247 +0,0 @@ -// Generated by CoffeeScript 1.12.5 - -/* -PDFDocument - represents an entire PDF document -By Devon Govett - */ - -(function() { - var PDFDocument, PDFObject, PDFPage, PDFReference, fs, stream, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - - stream = require('stream'); - - fs = require('fs'); - - PDFObject = require('./object'); - - PDFReference = require('./reference'); - - PDFPage = require('./page'); - - PDFDocument = (function(superClass) { - var mixin; - - extend(PDFDocument, superClass); - - function PDFDocument(options1) { - var key, ref1, ref2, val; - this.options = options1 != null ? options1 : {}; - PDFDocument.__super__.constructor.apply(this, arguments); - this.version = 1.3; - this.compress = (ref1 = this.options.compress) != null ? ref1 : true; - this._pageBuffer = []; - this._pageBufferStart = 0; - this._offsets = []; - this._waiting = 0; - this._ended = false; - this._offset = 0; - this._root = this.ref({ - Type: 'Catalog', - Pages: this.ref({ - Type: 'Pages', - Count: 0, - Kids: [] - }) - }); - this.page = null; - this.initColor(); - this.initVector(); - this.initFonts(); - this.initText(); - this.initImages(); - this.info = { - Producer: 'PDFKit', - Creator: 'PDFKit', - CreationDate: new Date() - }; - if (this.options.info) { - ref2 = this.options.info; - for (key in ref2) { - val = ref2[key]; - this.info[key] = val; - } - } - this._write("%PDF-" + this.version); - this._write("%\xFF\xFF\xFF\xFF"); - if (this.options.autoFirstPage !== false) { - this.addPage(); - } - } - - mixin = function(methods) { - var method, name, results; - results = []; - for (name in methods) { - method = methods[name]; - results.push(PDFDocument.prototype[name] = method); - } - return results; - }; - - mixin(require('./mixins/color')); - - mixin(require('./mixins/vector')); - - mixin(require('./mixins/fonts')); - - mixin(require('./mixins/text')); - - mixin(require('./mixins/images')); - - mixin(require('./mixins/annotations')); - - PDFDocument.prototype.addPage = function(options) { - var pages; - if (options == null) { - options = this.options; - } - if (!this.options.bufferPages) { - this.flushPages(); - } - this.page = new PDFPage(this, options); - this._pageBuffer.push(this.page); - pages = this._root.data.Pages.data; - pages.Kids.push(this.page.dictionary); - pages.Count++; - this.x = this.page.margins.left; - this.y = this.page.margins.top; - this._ctm = [1, 0, 0, 1, 0, 0]; - this.transform(1, 0, 0, -1, 0, this.page.height); - this.emit('pageAdded'); - return this; - }; - - PDFDocument.prototype.bufferedPageRange = function() { - return { - start: this._pageBufferStart, - count: this._pageBuffer.length - }; - }; - - PDFDocument.prototype.switchToPage = function(n) { - var page; - if (!(page = this._pageBuffer[n - this._pageBufferStart])) { - throw new Error("switchToPage(" + n + ") out of bounds, current buffer covers pages " + this._pageBufferStart + " to " + (this._pageBufferStart + this._pageBuffer.length - 1)); - } - return this.page = page; - }; - - PDFDocument.prototype.flushPages = function() { - var i, len, page, pages; - pages = this._pageBuffer; - this._pageBuffer = []; - this._pageBufferStart += pages.length; - for (i = 0, len = pages.length; i < len; i++) { - page = pages[i]; - page.end(); - } - }; - - PDFDocument.prototype.ref = function(data) { - var ref; - ref = new PDFReference(this, this._offsets.length + 1, data); - this._offsets.push(null); - this._waiting++; - return ref; - }; - - PDFDocument.prototype._read = function() {}; - - PDFDocument.prototype._write = function(data) { - if (!Buffer.isBuffer(data)) { - data = new Buffer(data + '\n', 'binary'); - } - this.push(data); - return this._offset += data.length; - }; - - PDFDocument.prototype.addContent = function(data) { - this.page.write(data); - return this; - }; - - PDFDocument.prototype._refEnd = function(ref) { - this._offsets[ref.id - 1] = ref.offset; - if (--this._waiting === 0 && this._ended) { - this._finalize(); - return this._ended = false; - } - }; - - PDFDocument.prototype.write = function(filename, fn) { - var err; - err = new Error('PDFDocument#write is deprecated, and will be removed in a future version of PDFKit. Please pipe the document into a Node stream.'); - console.warn(err.stack); - this.pipe(fs.createWriteStream(filename)); - this.end(); - return this.once('end', fn); - }; - - PDFDocument.prototype.output = function(fn) { - throw new Error('PDFDocument#output is deprecated, and has been removed from PDFKit. Please pipe the document into a Node stream.'); - }; - - PDFDocument.prototype.end = function() { - var font, key, name, ref1, ref2, val; - this.flushPages(); - this._info = this.ref(); - ref1 = this.info; - for (key in ref1) { - val = ref1[key]; - if (typeof val === 'string') { - val = new String(val); - } - this._info.data[key] = val; - } - this._info.end(); - ref2 = this._fontFamilies; - for (name in ref2) { - font = ref2[name]; - font.finalize(); - } - this._root.end(); - this._root.data.Pages.end(); - if (this._waiting === 0) { - return this._finalize(); - } else { - return this._ended = true; - } - }; - - PDFDocument.prototype._finalize = function(fn) { - var i, len, offset, ref1, xRefOffset; - xRefOffset = this._offset; - this._write("xref"); - this._write("0 " + (this._offsets.length + 1)); - this._write("0000000000 65535 f "); - ref1 = this._offsets; - for (i = 0, len = ref1.length; i < len; i++) { - offset = ref1[i]; - offset = ('0000000000' + offset).slice(-10); - this._write(offset + ' 00000 n '); - } - this._write('trailer'); - this._write(PDFObject.convert({ - Size: this._offsets.length + 1, - Root: this._root, - Info: this._info - })); - this._write('startxref'); - this._write("" + xRefOffset); - this._write('%%EOF'); - return this.push(null); - }; - - PDFDocument.prototype.toString = function() { - return "[object PDFDocument]"; - }; - - return PDFDocument; - - })(stream.Readable); - - module.exports = PDFDocument; - -}).call(this); diff --git a/pitfall/pdfkit/lib/reference.coffee b/pitfall/pdfkit/lib/reference.coffee index 8afe447f..0f0d4acb 100644 --- a/pitfall/pdfkit/lib/reference.coffee +++ b/pitfall/pdfkit/lib/reference.coffee @@ -11,7 +11,7 @@ class PDFReference extends stream.Writable super decodeStrings: no @gen = 0 @deflate = null - @compress = no + @compress = @document.compress and not @data.Filter @uncompressedLength = 0 @chunks = [] @@ -38,9 +38,7 @@ class PDFReference extends stream.Writable if @compress @initDeflate() if not @deflate - console.log("chunk = " + chunk) @deflate.write chunk - console.log("wrote chunk") else @chunks.push chunk @data.Length += chunk.length @@ -50,12 +48,19 @@ class PDFReference extends stream.Writable end: (chunk) -> super + console.log("end! " + @id) + console.log(@chunks) if @deflate @deflate.end() else @finalize() finalize: => + + + console.log("finalize! " + @id) + console.log(@chunks) + @offset = @document._offset @document._write "#{@id} #{@gen} obj" diff --git a/pitfall/pdfkit/lib/reference.js b/pitfall/pdfkit/lib/reference.js deleted file mode 100644 index cf745f25..00000000 --- a/pitfall/pdfkit/lib/reference.js +++ /dev/null @@ -1,117 +0,0 @@ -// Generated by CoffeeScript 1.12.5 - -/* -PDFReference - represents a reference to another object in the PDF object heirarchy -By Devon Govett - */ - -(function() { - var PDFObject, PDFReference, stream, zlib, - bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - - zlib = require('zlib'); - - stream = require('stream'); - - PDFReference = (function(superClass) { - extend(PDFReference, superClass); - - function PDFReference(document, id, data) { - this.document = document; - this.id = id; - this.data = data != null ? data : {}; - this.finalize = bind(this.finalize, this); - PDFReference.__super__.constructor.call(this, { - decodeStrings: false - }); - this.gen = 0; - this.deflate = null; - this.compress = false; - this.uncompressedLength = 0; - this.chunks = []; - } - - PDFReference.prototype.initDeflate = function() { - this.data.Filter = 'FlateDecode'; - this.deflate = zlib.createDeflate(); - this.deflate.on('data', (function(_this) { - return function(chunk) { - console.log("got data event for ref " + _this.id + " from " + _this.toString()); - _this.chunks.push(chunk); - return _this.data.Length += chunk.length; - }; - })(this)); - return this.deflate.on('end', (function(_this) { - return function() { - console.log("got end event for ref " + _this.id + " from " + _this.toString()); - return _this.finalize(); - }; - })(this)); - }; - - PDFReference.prototype._write = function(chunk, encoding, callback) { - var base; - if (!Buffer.isBuffer(chunk)) { - chunk = new Buffer(chunk + '\n', 'binary'); - } - this.uncompressedLength += chunk.length; - if ((base = this.data).Length == null) { - base.Length = 0; - } - if (this.compress) { - if (!this.deflate) { - this.initDeflate(); - } - console.log("chunk = " + chunk); - this.deflate.write(chunk); - console.log("wrote chunk"); - } else { - this.chunks.push(chunk); - this.data.Length += chunk.length; - } - return callback(); - }; - - PDFReference.prototype.end = function(chunk) { - PDFReference.__super__.end.apply(this, arguments); - if (this.deflate) { - return this.deflate.end(); - } else { - return this.finalize(); - } - }; - - PDFReference.prototype.finalize = function() { - var chunk, i, len, ref; - this.offset = this.document._offset; - this.document._write(this.id + " " + this.gen + " obj"); - this.document._write(PDFObject.convert(this.data)); - if (this.chunks.length) { - this.document._write('stream'); - ref = this.chunks; - for (i = 0, len = ref.length; i < len; i++) { - chunk = ref[i]; - this.document._write(chunk); - } - this.chunks.length = 0; - this.document._write('\nendstream'); - } - this.document._write('endobj'); - return this.document._refEnd(this); - }; - - PDFReference.prototype.toString = function() { - return this.id + " " + this.gen + " R"; - }; - - return PDFReference; - - })(stream.Writable); - - module.exports = PDFReference; - - PDFObject = require('./object'); - -}).call(this); diff --git a/pitfall/pitfall/param.rkt b/pitfall/pitfall/param.rkt index 5dd7a2e0..f6ec2c38 100644 --- a/pitfall/pitfall/param.rkt +++ b/pitfall/pitfall/param.rkt @@ -1,4 +1,3 @@ #lang racket/base (provide (all-defined-out)) -(define test-mode (make-parameter #f)) -(define compression-enabled (make-parameter #f)) \ No newline at end of file +(define test-mode (make-parameter #f)) \ No newline at end of file diff --git a/pitfall/pitfall/reference.rkt b/pitfall/pitfall/reference.rkt index b7e1289f..e83fb26a 100644 --- a/pitfall/pitfall/reference.rkt +++ b/pitfall/pitfall/reference.rkt @@ -1,31 +1,36 @@ #lang pitfall/racket -(require "object.rkt") +(require "object.rkt" "zlib.rkt") (provide PDFReference) -(define PDFReference - (class object% - (super-new) - (init-field document id [data (mhash)]) - (field [gen 0] - [deflate #f] - [compress (and (compression-enabled) - (· document compress) - (not (hash-ref data 'Filter #f)))] - [uncompressedLength 0] - [chunks empty] - [offset #f]) - - (as-methods - initDeflate - write - _write - end - finalize - toString))) +#| +(when (· this deflate) + (define compressed-chunks (map deflate (· this chunks))) + (set-field! chunks this compressed-chunks) + (hash-set! (· this data) 'Length (apply + (map bytes-length compressed-chunks)))) +|# + +(define-subclass object% (PDFReference document id [data (mhash)]) + (super-new) + (field [gen 0] + [deflate #f] + [compress (and (· document compress) + (not (hash-ref data 'Filter #f)))] + [uncompressedLength 0] + [chunks empty] + [offset #f]) + + (as-methods + initDeflate + write + _write + end + finalize + toString)) (define/contract (initDeflate this) (->m void?) - (hash-ref! (· this data) 'Filter "FlateDecode")) + (hash-ref! (· this data) 'Filter "FlateDecode") + (set-field! deflate this #t)) (define/contract (write this data) (any/c . ->m . void?) @@ -38,24 +43,28 @@ (newBuffer (string-append chunk-in "\n")))) (increment-field! uncompressedLength this (buffer-length chunk)) (hash-ref! (· this data) 'Length 0) - (cond - #;[(· this compress) (when (not (· this deflate)) (initDeflate)) - (send deflater write chunk)] ; todo: implement compression - [else (push-end-field! chunks this chunk) - (hash-update! (· this data) 'Length (λ (len) (+ len (buffer-length chunk))))]) + + (when (· this compress) (send this initDeflate)) + + (push-end-field! chunks this chunk) + (hash-update! (· this data) 'Length (curry + (buffer-length chunk))) (callback)) (define/contract (end this [chunk #f]) (() ((or/c any/c #f)) . ->*m . void?) ; (super) ; todo - (if (· this deflate) - (void) ; todo (deflate-end) - (send this finalize))) + (when (· this deflate) + (set-field! chunks this (list (deflate (apply bytes-append (· this chunks))))) + (hash-set! (· this data) 'Length (apply + (map buffer-length (· this chunks))))) + #;(report* 'end! (· this id) (· this chunks)) + (send this finalize)) (define/contract (finalize this) (->m void?) + #;(report* 'finalize! (· this id) (· this chunks)) + (set-field! offset this (· this document _offset)) (define this-doc (· this document)) diff --git a/pitfall/pitfall/test/test.pdf b/pitfall/pitfall/test/test.pdf index 50ed9ca0..e26206f0 100644 Binary files a/pitfall/pitfall/test/test.pdf and b/pitfall/pitfall/test/test.pdf differ diff --git a/pitfall/pitfall/test/test0.pdf b/pitfall/pitfall/test/test0.pdf index c79a55b0..9cbba60e 100644 Binary files a/pitfall/pitfall/test/test0.pdf and b/pitfall/pitfall/test/test0.pdf differ diff --git a/pitfall/pitfall/test/test0.rkt b/pitfall/pitfall/test/test0.rkt index 100f481e..8e24c70b 100644 --- a/pitfall/pitfall/test/test0.rkt +++ b/pitfall/pitfall/test/test0.rkt @@ -7,4 +7,4 @@ (send doc pipe (open-output-file this #:exists 'replace)) (send doc end))) -;(check-copy-equal? this) \ No newline at end of file +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test0c.coffee b/pitfall/pitfall/test/test0c.coffee new file mode 100644 index 00000000..8b03a710 --- /dev/null +++ b/pitfall/pitfall/test/test0c.coffee @@ -0,0 +1,10 @@ +PDFDocument = require 'pdfkit' +fs = require 'fs' + +# Create a new PDFDocument +# uncompressed obj order: 5 4 3 6 2 1 +# compressed obj order: 5 4 6 2 1 3 +doc = new PDFDocument({compress: yes}) +doc.pipe(fs.createWriteStream('test0c.pdf')) + +doc.end() \ No newline at end of file diff --git a/pitfall/pitfall/test/test0c.pdf b/pitfall/pitfall/test/test0c.pdf new file mode 100644 index 00000000..ea9f7a6a Binary files /dev/null and b/pitfall/pitfall/test/test0c.pdf differ diff --git a/pitfall/pitfall/test/test0c.rkt b/pitfall/pitfall/test/test0c.rkt new file mode 100644 index 00000000..e2189098 --- /dev/null +++ b/pitfall/pitfall/test/test0c.rkt @@ -0,0 +1,10 @@ +#lang pitfall/pdftest +(define-runtime-path this "test0crkt.pdf") + +(check-true + (let () + (define doc (make-object PDFDocument (hash 'compress #t))) + (send doc pipe (open-output-file this #:exists 'replace)) + (send doc end))) + +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test0crkt copy.pdf b/pitfall/pitfall/test/test0crkt copy.pdf new file mode 100644 index 00000000..b41c79ca Binary files /dev/null and b/pitfall/pitfall/test/test0crkt copy.pdf differ diff --git a/pitfall/pitfall/test/test0crkt.pdf b/pitfall/pitfall/test/test0crkt.pdf new file mode 100644 index 00000000..b41c79ca Binary files /dev/null and b/pitfall/pitfall/test/test0crkt.pdf differ diff --git a/pitfall/pitfall/test/test1.pdf b/pitfall/pitfall/test/test1.pdf index d0d18255..f05b02e9 100644 --- a/pitfall/pitfall/test/test1.pdf +++ b/pitfall/pitfall/test/test1.pdf @@ -1,5 +1,11 @@ %PDF-1.3 % +6 0 obj +<< +/Type /ExtGState +/ca 1 +>> +endobj 5 0 obj << /Type /Page @@ -12,28 +18,16 @@ endobj 4 0 obj << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/ExtGState << +/Gs1 6 0 R >> -endobj -3 0 obj -<< -/Length 90 >> -stream -1 0 0 -1 0 792 cm -0 20 m -100 160 l -130 200 150 120 v -190 -40 200 200 300 150 c -400 90 l -S - -endstream endobj -6 0 obj +7 0 obj << /Producer (PDFKit) /Creator (PDFKit) -/CreationDate (D:20170515171502Z) +/CreationDate (D:20170518183426Z) >> endobj 2 0 obj @@ -49,21 +43,34 @@ endobj /Kids [5 0 R] >> endobj +3 0 obj +<< +/Length 151 +/Filter /FlateDecode +>> +stream +x]] +0@Z + +@-@&C2 #Įp3}It`MNWnDpj$NPss&d%^.j*sS${i<>+|Yz71<ަ|caaE= +endstream +endobj xref -0 7 +0 8 0000000000 65535 f -0000000467 00000 n -0000000418 00000 n -0000000186 00000 n -0000000119 00000 n +0000000399 00000 n +0000000350 00000 n +0000000456 00000 n +0000000163 00000 n +0000000059 00000 n 0000000015 00000 n -0000000326 00000 n +0000000258 00000 n trailer << -/Size 7 +/Size 8 /Root 2 0 R -/Info 6 0 R +/Info 7 0 R >> startxref -524 +679 %%EOF diff --git a/pitfall/pitfall/test/test1c.coffee b/pitfall/pitfall/test/test1c.coffee new file mode 100644 index 00000000..54405e4b --- /dev/null +++ b/pitfall/pitfall/test/test1c.coffee @@ -0,0 +1,18 @@ +PDFDocument = require 'pdfkit' +fs = require 'fs' + +# Create a new PDFDocument +doc = new PDFDocument({compress: no}) +doc.pipe(fs.createWriteStream('test1c.pdf')) + +# Draw a triangle and a circle +doc.save() + .moveTo(100, 150) + .lineTo(100, 250) + .lineTo(200, 250) + .fill("#FF3300") + +doc.circle(280, 200, 50) + .fill("#6600FF") + +doc.end() \ No newline at end of file diff --git a/pitfall/pitfall/test/test1c.pdf b/pitfall/pitfall/test/test1c.pdf new file mode 100644 index 00000000..e9008427 --- /dev/null +++ b/pitfall/pitfall/test/test1c.pdf @@ -0,0 +1,76 @@ +%PDF-1.3 +% +6 0 obj +<< +/Type /ExtGState +/ca 1 +>> +endobj +5 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [0 0 612 792] +/Contents 3 0 R +/Resources 4 0 R +>> +endobj +4 0 obj +<< +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/ExtGState << +/Gs1 6 0 R +>> +>> +endobj +7 0 obj +<< +/Producer (PDFKit) +/Creator (PDFKit) +/CreationDate (D:20170518193351Z) +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 1 0 R +>> +endobj +1 0 obj +<< +/Type /Pages +/Count 1 +/Kids [5 0 R] +>> +endobj +3 0 obj +<< +/Length 151 +/Filter /FlateDecode +>> +stream +x]] +0@Z + +@-@&C2 #Įp3}It`MNWnDpj$NPss&d%^.j*sS${i<>+|Yz71<ަ|caaE= +endstream +endobj +xref +0 8 +0000000000 65535 f +0000000399 00000 n +0000000350 00000 n +0000000456 00000 n +0000000163 00000 n +0000000059 00000 n +0000000015 00000 n +0000000258 00000 n +trailer +<< +/Size 8 +/Root 2 0 R +/Info 7 0 R +>> +startxref +679 +%%EOF diff --git a/pitfall/pitfall/test/test1c.rkt b/pitfall/pitfall/test/test1c.rkt new file mode 100644 index 00000000..0d809fc7 --- /dev/null +++ b/pitfall/pitfall/test/test1c.rkt @@ -0,0 +1,22 @@ +#lang pitfall/pdftest +(define-runtime-path this "test1crkt.pdf") + +(check-true + (let ([doc (make-object PDFDocument (hash 'compress #t))]) + (send doc pipe (open-output-file this #:exists 'replace)) + + ;; Draw a triangle and a circle + (send* doc + [save] + [moveTo 100 150] + [lineTo 100 250] + [lineTo 200 250] + [fill "#FF3300"]) + + (send* doc + [circle 280 200 50] + [fill "#6600FF"]) + + (send doc end))) + +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test1crkt copy.pdf b/pitfall/pitfall/test/test1crkt copy.pdf new file mode 100644 index 00000000..508dd601 --- /dev/null +++ b/pitfall/pitfall/test/test1crkt copy.pdf @@ -0,0 +1,76 @@ +%PDF-1.3 +% +6 0 obj +<< +/ca 1 +/Type /ExtGState +>> +endobj +5 0 obj +<< +/Parent 1 0 R +/Resources 4 0 R +/Contents 3 0 R +/MediaBox [0 0 612 792] +/Type /Page +>> +endobj +4 0 obj +<< +/ExtGState << +/Gs1 6 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +endobj +3 0 obj +<< +/Length 151 +/Filter /FlateDecode +>> +stream +x]] +0@Z + +@-@&C2 #Įp3}It`MNWnDpj$NPss&d%^.j*sS${i<>+|Yz71<ަ|caaE= +endstream +endobj +7 0 obj +<< +/CreationDate (D:19700101000000Z) +/Creator (PitfallKit) +/Producer (PitfallKit) +>> +endobj +2 0 obj +<< +/Pages 1 0 R +/Type /Catalog +>> +endobj +1 0 obj +<< +/Kids [5 0 R] +/Count 1 +/Type /Pages +>> +endobj +xref +0 8 +0000000000 65535 f +0000000630 00000 n +0000000581 00000 n +0000000258 00000 n +0000000163 00000 n +0000000059 00000 n +0000000015 00000 n +0000000481 00000 n +trailer +<< +/Info 7 0 R +/Root 2 0 R +/Size 8 +>> +startxref +687 +%%EOF diff --git a/pitfall/pitfall/test/test1crkt.pdf b/pitfall/pitfall/test/test1crkt.pdf new file mode 100644 index 00000000..508dd601 --- /dev/null +++ b/pitfall/pitfall/test/test1crkt.pdf @@ -0,0 +1,76 @@ +%PDF-1.3 +% +6 0 obj +<< +/ca 1 +/Type /ExtGState +>> +endobj +5 0 obj +<< +/Parent 1 0 R +/Resources 4 0 R +/Contents 3 0 R +/MediaBox [0 0 612 792] +/Type /Page +>> +endobj +4 0 obj +<< +/ExtGState << +/Gs1 6 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +endobj +3 0 obj +<< +/Length 151 +/Filter /FlateDecode +>> +stream +x]] +0@Z + +@-@&C2 #Įp3}It`MNWnDpj$NPss&d%^.j*sS${i<>+|Yz71<ަ|caaE= +endstream +endobj +7 0 obj +<< +/CreationDate (D:19700101000000Z) +/Creator (PitfallKit) +/Producer (PitfallKit) +>> +endobj +2 0 obj +<< +/Pages 1 0 R +/Type /Catalog +>> +endobj +1 0 obj +<< +/Kids [5 0 R] +/Count 1 +/Type /Pages +>> +endobj +xref +0 8 +0000000000 65535 f +0000000630 00000 n +0000000581 00000 n +0000000258 00000 n +0000000163 00000 n +0000000059 00000 n +0000000015 00000 n +0000000481 00000 n +trailer +<< +/Info 7 0 R +/Root 2 0 R +/Size 8 +>> +startxref +687 +%%EOF diff --git a/pitfall/pitfall/test/test2.rkt b/pitfall/pitfall/test/test2.rkt index 50dab79b..7325924c 100644 --- a/pitfall/pitfall/test/test2.rkt +++ b/pitfall/pitfall/test/test2.rkt @@ -2,7 +2,7 @@ (define-runtime-path this "test2rkt.pdf") (check-true - (let ([doc (new PDFDocument)]) + (let ([doc (make-object PDFDocument (hash 'compress #f))]) (send doc pipe (open-output-file this #:exists 'replace)) ;; curved path as bezier diff --git a/pitfall/pitfall/test/test2c.rkt b/pitfall/pitfall/test/test2c.rkt new file mode 100644 index 00000000..61f7fab0 --- /dev/null +++ b/pitfall/pitfall/test/test2c.rkt @@ -0,0 +1,77 @@ +#lang pitfall/pdftest +(define-runtime-path this "test2crkt.pdf") + +(check-true + (let ([doc (make-object PDFDocument (hash 'compress #t))]) + (send doc pipe (open-output-file this #:exists 'replace)) + + ;; curved path as bezier + (send* doc + [moveTo 0 20] + [lineTo 100 160] + [quadraticCurveTo 130 200 150 120] + [bezierCurveTo 190 -40 200 200 300 150] + [lineTo 400 90] + [stroke]) + + (send* doc [translate 0 200]) + + ;; triangle + (send* doc + [polygon '(100 0) '(50 100) '(150 100)] + [stroke]) + + ;; dashed circle + (send* doc + [save] + [translate 200 0] + [circle 100 50 50] + [dash 5 (hash 'space 10)] + [stroke] + [restore]) + + ;; filled circle + (send* doc + [save] + [translate 400 0] + [circle 100 50 50] + [lineWidth 3] + [fillOpacity 0.8] + [fillAndStroke "red" "#900"] + [restore]) + + (send* doc [translate 0 200]) + + ;; these examples are easier to see with a large line width + (send* doc [lineWidth 25]) + + ;; line cap settings + (send* doc [lineCap 'butt] + [moveTo 50 20] + [lineTo 100 20] + [stroke] + [lineCap 'round] + [moveTo 150 20] + [lineTo 200 20] + [stroke]) + + ;; square line cap shown with a circle instead of a line so you can see it + (send* doc [lineCap 'square] + [moveTo 250 20] + [circle 275 30 15] + [stroke]) + + ;; line join settings + (send* doc [lineJoin 'miter] + [rect 50 100 50 50] + [stroke] + [lineJoin 'round] + [rect 150 100 50 50] + [stroke] + [lineJoin 'bevel] + [rect 250 100 50 50] + [stroke]) + + (send doc end))) + +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test2crkt copy.pdf b/pitfall/pitfall/test/test2crkt copy.pdf new file mode 100644 index 00000000..b94236de Binary files /dev/null and b/pitfall/pitfall/test/test2crkt copy.pdf differ diff --git a/pitfall/pitfall/test/test2crkt.pdf b/pitfall/pitfall/test/test2crkt.pdf new file mode 100644 index 00000000..b94236de Binary files /dev/null and b/pitfall/pitfall/test/test2crkt.pdf differ diff --git a/pitfall/pitfall/test/test3.rkt b/pitfall/pitfall/test/test3.rkt index 9d999c64..0391b3f5 100644 --- a/pitfall/pitfall/test/test3.rkt +++ b/pitfall/pitfall/test/test3.rkt @@ -2,7 +2,7 @@ (define-runtime-path this "test3rkt.pdf") (check-true - (let ([doc (new PDFDocument)]) + (let ([doc (make-object PDFDocument (hash 'compress #f))]) (send doc pipe (open-output-file this #:exists 'replace)) (send doc text "Hello world") (send doc end))) diff --git a/pitfall/pitfall/test/test3c.rkt b/pitfall/pitfall/test/test3c.rkt new file mode 100644 index 00000000..eb0c045a --- /dev/null +++ b/pitfall/pitfall/test/test3c.rkt @@ -0,0 +1,10 @@ +#lang pitfall/pdftest +(define-runtime-path this "test3crkt.pdf") + +(check-true + (let ([doc (make-object PDFDocument (hash 'compress #t))]) + (send doc pipe (open-output-file this #:exists 'replace)) + (send doc text "Hello world") + (send doc end))) + +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test3crkt copy.pdf b/pitfall/pitfall/test/test3crkt copy.pdf new file mode 100644 index 00000000..e0bc2b69 Binary files /dev/null and b/pitfall/pitfall/test/test3crkt copy.pdf differ diff --git a/pitfall/pitfall/test/test3crkt.pdf b/pitfall/pitfall/test/test3crkt.pdf new file mode 100644 index 00000000..e0bc2b69 Binary files /dev/null and b/pitfall/pitfall/test/test3crkt.pdf differ diff --git a/pitfall/pitfall/test/test4c.rkt b/pitfall/pitfall/test/test4c.rkt new file mode 100644 index 00000000..7674f064 --- /dev/null +++ b/pitfall/pitfall/test/test4c.rkt @@ -0,0 +1,68 @@ +#lang pitfall/pdftest +(define-runtime-path this "test4crkt.pdf") + +(check-true + (let ([doc (make-object PDFDocument (hash 'compress #t))]) + (send doc pipe (open-output-file this #:exists 'replace)) + + (send* doc + [font "Courier-Bold"] + [fontSize 10] + [text "Hello"] + [translate -30 30] + [font "Courier-BoldOblique"] + [fontSize 11] + [text "Hello"] + [translate -30 30] + [font "Courier-Oblique"] + [fontSize 12] + [text "Hello"] + [translate -30 30] + [font "Courier"] + [fontSize 14] + [text "Hello"] + [translate -30 30] + [font "Helvetica-Bold"] + [fontSize 16] + [text "Hello"] + [translate -30 30] + [font "Helvetica-BoldOblique"] + [fontSize 18] + [text "Hello"] + [translate -30 30] + [font "Helvetica-Oblique"] + [fontSize 20] + [text "Hello"] + [translate -30 30] + [font "Helvetica"] + [fontSize 22] + [text "Hello"] + [translate -30 30] + [font "Symbol"] + [fontSize 24] + [text "Hello"] + [translate -30 30] + [font "Times-Bold"] + [fontSize 26] + [text "Hello"] + [translate -30 30] + [font "Times-BoldItalic"] + [fontSize 28] + [text "Hello"] + [translate -30 30] + [font "Times-Italic"] + [fontSize 30] + [text "Hello"] + [translate -30 30] + [font "Times-Roman"] + [fontSize 32] + [text "Hello"] + [translate -30 30] + [font "ZapfDingbats"] + [fontSize 34] + [text "Hello"]) + + + (send doc end))) + +(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test4crkt copy.pdf b/pitfall/pitfall/test/test4crkt copy.pdf new file mode 100644 index 00000000..dad42ba2 Binary files /dev/null and b/pitfall/pitfall/test/test4crkt copy.pdf differ diff --git a/pitfall/pitfall/test/test4crkt.pdf b/pitfall/pitfall/test/test4crkt.pdf new file mode 100644 index 00000000..dad42ba2 Binary files /dev/null and b/pitfall/pitfall/test/test4crkt.pdf differ diff --git a/pitfall/pitfall/test/test5c.rkt b/pitfall/pitfall/test/test5c.rkt new file mode 100644 index 00000000..3428c4ad --- /dev/null +++ b/pitfall/pitfall/test/test5c.rkt @@ -0,0 +1,20 @@ +#lang pitfall/pdftest +(define-runtime-path this "test5crkt.pdf") + +(check-true + (let ([doc (make-object PDFDocument (hash 'compress #t))]) + (send doc pipe (open-output-file this #:exists 'replace)) + + ;; # Set the font, draw some text, and embed an image +(send* doc + [font "Times-Italic"] + [fontSize 25] + [text "Some text with an embedded font!" 100 100 (hash 'lineBreak #f)] + [image "assets/test.png" 100 160 (hash 'width 412)] + [image "assets/test.jpeg" 190 400 (hash 'height 300)] + ) + + + (send doc end))) + +;(check-copy-equal? this) \ No newline at end of file diff --git a/pitfall/pitfall/test/test5crkt.pdf b/pitfall/pitfall/test/test5crkt.pdf new file mode 100644 index 00000000..e69de29b