From 8514080f969eb3957bbc33930aee07981563e6a9 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 20 Aug 2020 14:47:56 -0700 Subject: [PATCH 1/3] Adding HTML conversion API --- .gitignore | 3 +- app.js | 76 ++++++++++++++++++++---------- files/index.html | 97 +++++++++++++++++++++++++++++++++++++++ files/myhtml.pdf | Bin package-lock.json | 26 +++++++++++ package.json | 2 + tools/copy-pdfnet-lib.js | 12 +++++ 7 files changed, 192 insertions(+), 24 deletions(-) create mode 100644 files/index.html create mode 100644 files/myhtml.pdf create mode 100644 tools/copy-pdfnet-lib.js diff --git a/.gitignore b/.gitignore index 18b39e3..f5d1759 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ # node-modules -node_modules/ \ No newline at end of file +node_modules/ +pdfnet-node \ No newline at end of file diff --git a/app.js b/app.js index ce0d645..787826d 100644 --- a/app.js +++ b/app.js @@ -111,10 +111,34 @@ app.get('/convert/:filename', (req, res) => { const pdfdoc = await PDFNet.PDFDoc.create(); await pdfdoc.initSecurityHandler(); await PDFNet.Convert.toPdf(pdfdoc, inputPath); - pdfdoc.save( - outputPath, - PDFNet.SDFDoc.SaveOptions.e_linearized, - ); + pdfdoc.save(outputPath, PDFNet.SDFDoc.SaveOptions.e_linearized); + }; + + PDFNetEndpoint(main, outputPath, res); +}); + +app.get('/convertHTML/:filename-:htmlPath', (req, res) => { + const filename = req.params.filename; + const htmlPath = req.params.htmlPath; + + const inputPath = path.resolve(__dirname, filesPath, htmlPath); + const outputPath = path.resolve(__dirname, filesPath, `${filename}.pdf`); + + const main = async () => { + try { + await PDFNet.HTML2PDF.setModulePath( + path.resolve(__dirname, './pdfnet-node/lib/'), + ); + const html2pdf = await PDFNet.HTML2PDF.create(); + const pdfdoc = await PDFNet.PDFDoc.create(); + await pdfdoc.initSecurityHandler(); + await html2pdf.insertFromUrl('http://www.gutenberg.org/wiki/Main_Page'); + await html2pdf.convert(pdfdoc); + await pdfdoc.save(outputPath, PDFNet.SDFDoc.SaveOptions.e_linearized); + } catch (err) { + console.log(err); + } + }; PDFNetEndpoint(main, outputPath, res); @@ -129,10 +153,7 @@ app.get('/generate/:filename', (req, res) => { await pdfdoc.initSecurityHandler(); const page1 = await pdfdoc.pageCreate(); pdfdoc.pagePushBack(page1); - pdfdoc.save( - outputPath, - PDFNet.SDFDoc.SaveOptions.e_linearized, - ); + pdfdoc.save(outputPath, PDFNet.SDFDoc.SaveOptions.e_linearized); }; PDFNetEndpoint(main, outputPath, res); @@ -149,7 +170,11 @@ app.get('/textExtract/:filename-:pagenumber', (req, res) => { } const inputPath = path.resolve(__dirname, filesPath, filename); - const outputPath = path.resolve(__dirname, filesPath, `${filename}-${pageNumber}.txt`); + const outputPath = path.resolve( + __dirname, + filesPath, + `${filename}-${pageNumber}.txt`, + ); const main = async () => { await PDFNet.initialize(); @@ -168,7 +193,7 @@ app.get('/textExtract/:filename-:pagenumber', (req, res) => { let text; text = await txt.getAsText(); - fs.writeFile(outputPath, text, (err) => { + fs.writeFile(outputPath, text, err => { if (err) return console.log(err); }); } catch (err) { @@ -181,10 +206,14 @@ app.get('/textExtract/:filename-:pagenumber', (req, res) => { app.get('/replaceContent/:name', (req, res) => { const name = req.params.name.replace('_', ' '); - const filename = 'template_letter.pdf' + const filename = 'template_letter.pdf'; const inputPath = path.resolve(__dirname, filesPath, filename); - const outputPath = path.resolve(__dirname, filesPath, `${filename}_replaced.pdf`); + const outputPath = path.resolve( + __dirname, + filesPath, + `${filename}_replaced.pdf`, + ); const main = async () => { const pdfdoc = await PDFNet.PDFDoc.createFromFilePath(inputPath); @@ -197,10 +226,7 @@ app.get('/replaceContent/:name', (req, res) => { await replacer.addString('DATE', new Date(Date.now()).toLocaleString()); await replacer.process(page); - pdfdoc.save( - outputPath, - PDFNet.SDFDoc.SaveOptions.e_linearized, - ); + pdfdoc.save(outputPath, PDFNet.SDFDoc.SaveOptions.e_linearized); }; PDFNetEndpoint(main, outputPath, res); @@ -217,7 +243,11 @@ app.get('/watermark/:filename-:watermark', (req, res) => { } const inputPath = path.resolve(__dirname, filesPath, filename); - const outputPath = path.resolve(__dirname, filesPath, `${filename}_watermarked.pdf`); + const outputPath = path.resolve( + __dirname, + filesPath, + `${filename}_watermarked.pdf`, + ); const main = async () => { const pdfdoc = await PDFNet.PDFDoc.createFromFilePath(inputPath); @@ -234,13 +264,13 @@ app.get('/watermark/:filename-:watermark', (req, res) => { ); const redColorPt = await PDFNet.ColorPt.init(1, 0, 0); stamper.setFontColor(redColorPt); - const pgSet = await PDFNet.PageSet.createRange(1, await pdfdoc.getPageCount()); + const pgSet = await PDFNet.PageSet.createRange( + 1, + await pdfdoc.getPageCount(), + ); stamper.stampText(pdfdoc, watermark, pgSet); - pdfdoc.save( - outputPath, - PDFNet.SDFDoc.SaveOptions.e_linearized, - ); + pdfdoc.save(outputPath, PDFNet.SDFDoc.SaveOptions.e_linearized); }; PDFNetEndpoint(main, outputPath, res); @@ -261,7 +291,7 @@ const PDFNetEndpoint = (main, pathname, res) => { } }); }) - .catch((error) => { + .catch(error => { res.statusCode = 500; res.end(error); }); diff --git a/files/index.html b/files/index.html new file mode 100644 index 0000000..43f8759 --- /dev/null +++ b/files/index.html @@ -0,0 +1,97 @@ + + + + + + + +
+
+

Register

+

Please fill in this form to create an account.

+
+ + + + + + + + + +
+

By creating an account you agree to our Terms & Privacy.

+ + +
+ + +
+ + + diff --git a/files/myhtml.pdf b/files/myhtml.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/package-lock.json b/package-lock.json index 405f22b..5e7b03e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -853,6 +853,17 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", @@ -1244,6 +1255,15 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -2284,6 +2304,12 @@ "crypto-random-string": "^2.0.0" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index c5f8499..9dc7468 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "index.js", "scripts": { "start": "nodemon server.js", + "postinstall": "node tools/copy-pdfnet-lib.js", "test": "mocha --timeout 10000" }, "author": "", @@ -16,6 +17,7 @@ "nodemon": "^2.0.3" }, "devDependencies": { + "fs-extra": "^7.0.1", "chai": "^4.2.0", "chai-http": "^4.3.0", "mocha": "^7.1.1" diff --git a/tools/copy-pdfnet-lib.js b/tools/copy-pdfnet-lib.js new file mode 100644 index 0000000..9155f41 --- /dev/null +++ b/tools/copy-pdfnet-lib.js @@ -0,0 +1,12 @@ +const fs = require('fs-extra'); + +const copyFiles = async () => { + try { + await fs.copy('./node_modules/@pdftron/pdfnet-node/lib', './pdfnet-node/lib'); + console.log('PDFNet files copied over successfully'); + } catch (err) { + console.error(err); + } +}; + +copyFiles(); \ No newline at end of file From 662a63f733fef3e8585518e89af4885f620361b8 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 21 Aug 2020 10:49:46 -0700 Subject: [PATCH 2/3] Added latest settings an configs --- app.js | 7 ++-- files/myhtml.pdf | Bin 0 -> 15338 bytes package-lock.json | 85 +++++++++++++++------------------------------- package.json | 6 ++-- 4 files changed, 35 insertions(+), 63 deletions(-) diff --git a/app.js b/app.js index 787826d..6e5a367 100644 --- a/app.js +++ b/app.js @@ -129,10 +129,13 @@ app.get('/convertHTML/:filename-:htmlPath', (req, res) => { await PDFNet.HTML2PDF.setModulePath( path.resolve(__dirname, './pdfnet-node/lib/'), ); + const settings = await PDFNet.HTML2PDF.WebPageSettings.create(); + settings.setAllowJavaScript(true); + settings.setProduceForms(true); + settings.SetPrintBackground(false); const html2pdf = await PDFNet.HTML2PDF.create(); const pdfdoc = await PDFNet.PDFDoc.create(); - await pdfdoc.initSecurityHandler(); - await html2pdf.insertFromUrl('http://www.gutenberg.org/wiki/Main_Page'); + await html2pdf.insertFromUrl2(inputPath, settings); await html2pdf.convert(pdfdoc); await pdfdoc.save(outputPath, PDFNet.SDFDoc.SaveOptions.e_linearized); } catch (err) { diff --git a/files/myhtml.pdf b/files/myhtml.pdf index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4901f52509d7923b340d87506c4ac79d7872cbbe 100644 GIT binary patch literal 15338 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 Date: Mon, 19 Oct 2020 09:20:39 -0700 Subject: [PATCH 3/3] Added HTML conversion --- README.md | 11 ++++++++ app.js | 5 ++-- files/document.docx.pdf | Bin 18611 -> 19543 bytes files/myhtml.pdf | Bin 15338 -> 15318 bytes files/new.pdf | Bin 1577 -> 1637 bytes files/optimized_webviewer.pdf | Bin 1494974 -> 1494974 bytes files/template_letter.pdf_replaced.pdf | Bin 33958 -> 34110 bytes files/webviewer.pdf_watermarked.pdf | Bin 327405 -> 327413 bytes package-lock.json | 36 ++++++++++++------------- package.json | 3 +-- test/test.js | 12 +++++++++ tools/copy-pdfnet-lib.js | 12 --------- 12 files changed, 45 insertions(+), 34 deletions(-) delete mode 100644 tools/copy-pdfnet-lib.js diff --git a/README.md b/README.md index 6e67a36..fbe5f11 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,17 @@ The endpoint converts the file to a PDF. Conversion is possible for the followin ##### HTTP Request `GET http://localhost:9000/convert/:filename` +### Convert to PDF from HTML + +The endpoint converts the HTML to a PDF. There are several settings available to get the best results. Uses [PDFTron Node.js API for HTML2PDF](https://www.pdftron.com/documentation/samples/node/js/HTML2PDFTest?platforms=nodejs). + +##### HTTP Request +`GET http://localhost:9000/convertHTML/:filename-:pathToHTML` + +##### Example +Converts an HTML form to a PDF +`http://localhost:9000/convertHTML/myhtml-index.html` + ### Optimize PDF The endpoint converts the PDF to an optimized PDF to be used with [PDFTron WebViewer](https://www.pdftron.com/webviewer/demo/). Uses [PDFTron Node.js API](https://www.pdftron.com/api/pdfnet-node/PDFNet.PDFDoc.html#saveViewerOptimized__anchor). diff --git a/app.js b/app.js index 6e5a367..9820780 100644 --- a/app.js +++ b/app.js @@ -1,8 +1,10 @@ const express = require('express'); const fs = require('fs'); const path = require('path'); + const { PDFNet } = require('@pdftron/pdfnet-node'); const mimeType = require('./modules/mimeType'); + const filesPath = './files'; const app = express(); @@ -127,12 +129,11 @@ app.get('/convertHTML/:filename-:htmlPath', (req, res) => { const main = async () => { try { await PDFNet.HTML2PDF.setModulePath( - path.resolve(__dirname, './pdfnet-node/lib/'), + path.resolve(__dirname, './node_modules/@pdftron/pdfnet-node/lib/'), ); const settings = await PDFNet.HTML2PDF.WebPageSettings.create(); settings.setAllowJavaScript(true); settings.setProduceForms(true); - settings.SetPrintBackground(false); const html2pdf = await PDFNet.HTML2PDF.create(); const pdfdoc = await PDFNet.PDFDoc.create(); await html2pdf.insertFromUrl2(inputPath, settings); diff --git a/files/document.docx.pdf b/files/document.docx.pdf index 03eb9a8b3a9ca09952d42f101b7f67802366014a..a25e3bebbbf05080b10445fe52c9d13af1ee4151 100644 GIT binary patch delta 7680 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 delta 6712 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 delta 704 zcmcas{;GU}qPV58zK24zf`zH2f}yFYLae?IkTy1+Xd%OFX<#rhd{so4NsO_vX>mx5 zv5`@Xk-1Tfu_;i*5Qxo8V~ovBt+Zo|P0WB?Q&UX^4dPW#4rbH?+F>}kh0%tQZSp}z zMadY2?#9N6*N)VuT{rjPdA7Y_n{0Lx14EbK=HHA<83p>%7?_09*+LF5waExe`7ll1 zz^ul>F_)jgf}5LbvZ96X=8w#OOc>24zq8P+_uUh7PN`|{W34S)+vWaV=vuOC3Ujrl zq1dnYv%7V_EY-KZIdiV(CQbnj2`vvr=|(n1krahC$sUI#njB1;?Tu_RH6;2Cw=cie zd|*?dyZjm!?medakDpZO@o|oDf1b_dA+6K6!Kkm?uCi(WEig%*ZC#eLgwO;5{ ziu(HT+`IpiwbH*Ym)#u~I%Vr-U6whU_cyTHPFNE9?b5gUZybW(KJcc^%W9h}Z52bi pI6P?;FY3*v#@42%@VZ5|<0yxcgv3W-hJ@D1w${3|vv!ZQ6abVl_w@h( diff --git a/files/new.pdf b/files/new.pdf index 4d1e55ed7a6c4f72854eef81a3ab25702617566d..f274213837c47f09f77eb59bf38eb4e6fd02b49c 100644 GIT binary patch delta 511 zcmZ3<^OR?ToRO)SzK24zg1M2If}w%ALae@zf}xqQxxPsp6f}y@25c?~b z>4zv78W~IsSQo9N8e?Q=9Aji`t_UQ|Vq#*9O-y2p%z;8?M&1@N1_lN|5mWaVV*_JN z1r1V^Pj+S0WHK_CT)=28`ifPk$GhRk|CI{wk`+Ea=VxZHlxN+1fYFgrYS%FarmH+F z8U#5aB`g$tW(f4~2JtX>i7-CgEX{1f=xJzRXlZC>1SF$0^?mbGToOxCHC(KW41hw& zQUOKzDW%D&MH&GvZXreac?v+%&%0Q%2_sQ>@~ delta 427 zcmaFLvyx|moRP7azK24zg1Ld2f}w%ALae@zf}yFoxxPsp6f}y@25c?~b z>4zv78d^*YSmz#NU}P3!WNIE`WMFD)U>sv?XsQ!#0pgi!#~2$J>sV+iXb@I3Ig(M6 z$_)xgxy*wDhz(9|?aQ{Oi~#U-&MRl~)~$iT<|AvL*!MV8%M t&(P4^#C-A^mN2UMA(l0YPn5@pr)RFiwfWpU3<7T^A7#~{n(;ntk^mSXZ1VsB diff --git a/files/optimized_webviewer.pdf b/files/optimized_webviewer.pdf index 713131b779427ec6cfd12ad0a9eb5df3a8836b4f..2492451894fd0b290d2d7d401bbf9e850517a54e 100644 GIT binary patch delta 374 zcmdltKYHK%=nbn`>ib;PQ+Og()r@Cp%-ftgQ%1tdw(yW(pl4j)qdNDg+6z~j2Ti}L zS=%7cncIEJR_^+;!UzQw)>TV=jEZ;XJmpVoY&gIveoJ>B2ea!diM|d?>ytM79%O3G zvxwd1m1Nkzc(HU$id#^>qIQqARHPcG;RT(BM27}l=F5|<9cJ-&)L%WIWXAL7%%pOk zJ7OQ~1Ij*R-8iUv`and;;R6S3p3XgdkhxuI+rGWWYLxFgCf@F8d2xD@?;;+%^q?I= z;$}0n3qFgO*ChKT7$;2GV^?U_yn^}6qyn~SF{}z_IUoHgVL2|QY_E%`#GF9P1;pGy%mc){K+Ffk{6H)K#DYL91jNEXECR%$+mEq|{Wu8#3`m)} delta 374 zcmdltKYHK%=nbn`>Zfv_V`_ZMCT(SsXT;4Cx8;Y@lh;yWx1XgvD{xtISsFKz!1&0Ouf9pL|&kNb)##J#E+S( z?`Q1LeNeyP&4a5On!TqrZd}pU*jRbWy1kj5&ormDy7#BszUD*QBsnimSDo!5S#xel zfvR4PLHL7bnt4Bt%{h>EK%=tuQ4U)m`wZ2GJUTnM9A*h0`T3HgPuDGH-Nmm}C6+-q z+?PLFH^p>!;Lj^PYzq=3n7#W1T)5bk<*noybZ2J8O*j0?DBOIEwfz_?BM>tIF*6Xe z05M364T#x+m;;D8ftU-3xq+Amhx5&%^- Bq$mIY diff --git a/files/template_letter.pdf_replaced.pdf b/files/template_letter.pdf_replaced.pdf index 6a744e93d63401755e4fa21befb1b16e0e80ea25..571919823847144b62ba6bd1683c0e652bc25a1f 100644 GIT binary patch delta 15170 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 delta 15047 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 ZC=vxHv2tr>Ancea1PD3+m=;p<{{eIp56u7o diff --git a/files/webviewer.pdf_watermarked.pdf b/files/webviewer.pdf_watermarked.pdf index 66292aa74b06f296720954a90ed16e65da8ebc01..e6ed681abd4a01582792b870539d9b99359cec62 100644 GIT binary patch delta 2242 zcmV;z2tD`h{S)>56ObYqG%znnAX^|gH!&bLGBF@sFH9gaGB-3aGm$$U0yiPUX0uCPG5;Mqn_=ICBi^@!e)Ke^663*p(vDOt|KmQO&lrYM;d3bsM z0;f(Xmz9%O1g(rZy1J41LCgY&g)QaEjag6MNNh^G zxH`e%hq!-+fJP$k9m|rpk8cPhde1Z~`8_>f0jM%nYwDV)or@z1m5%i*`78jb1iIyr z^p2vJw~ud7I5gcT=jGQoNGhX591+%n3=7}T$fa@$D7ULsD&$q@8V<>#1}9b?#og_C zbN5s;@n~*derI|H&49wj7fV2b< z7lK7Z8TdJw?@i!{5Z<7&Ai!Zo<8+Y@hB*Zb&IHCM9c(S-7LZ*-{atT@!*4-uT{h8Wzj5EjFz)F7zB78FgO@AFf#ZszF^!S?(D%( z;h-hS&n(BHz+k`;z@5P0Aj~Moya8ww2UA*tS%c8I3k?kn7Z_NW9T)_-9DuSwuRLPp zVUl1-5Lf`rCJk!bL6}~j$-uHM1W0p&IIMvT+(3#6Q(2DlTGm6ZQVar;<*W%n{&WVG zH4A|>BM`X)0J9U@{*$rB6SJTO$$ShkFflnXHZm|VIa(=~k)Z+wIR>g`wl*?+Bmuou9%d~9r(|(ZGjqPo8O#(sD zP~SAmI^Wr^S2n_HUy4Y8OsIrAAK_PcUqXpi zD+a7dg{Kpsn3N!bGl+4;okkR5Y+)i79s#Az(<0YRTjyR?RCTt~OGuJylP6$R^{ScU zVKA|v{c5Z8683z7g*WADj-YVJSkS?~T-v-U9qjRVw$WHWOf?bC=cG4mT%VjuFzJo^ zPJe{8a6JYh&tR_Aj@uK6(mK~gTh4Jt5epEAE-gx-j)9APafZ`qW#Fpz(0P9b27K6S zRIvCG6>qxijr!T4v1U6ezgBpwdSzG!p30TRZF_Vn(($=4f8BIqNZTPRD!=%CQ+hJ-GHZnt`wcR1smbOIcK z0)WR^6fc~3ptpGeSI4Z8V~WSwtrzBnfgvlTyD4%W_10Xc82K|F2;7N|tS<6pT7Rw! zLl_ni-v+E>;+O)77 z(vOW^8&m@Fr(h4he!w`EXD|eHFyWYv`bju>1pcSo{0D3#XDPFtLN zE)W=utfj6yFL08?$tz?i#ZJiR1T1W!(avU%jZi8l19LE?;QR$L`~yJn1t9PQkmD0@ zMuQ&+Nge~_k%31_DFe#Dz)Uh?Y@$p>DcZk-y*u|Ga0b7=zWuGW*V+3V zPt4<~7Hx|s5?(NrT|?cs6zH|1%MB}At=2y2gJw zu>9$8Z}YL2K&^z&tP?*8u7-x4ZupU9JBb|A;R0vJW>Wi;GCNMjnNT}m-d|qJGn^Ty z4NWJ_P#VlgCc4jRS#tay$LE}-7k`es$b$Zan{b9q4Q#?mgCFo6X2VBV1*7EgWgTZC zxUa6kEq3(31kPW%m(f*w*XaeURvUkoe4&rb`4kSK8%TBQJ4NuXpr~)hXk@T0afb{l84~ Qzf+%G=Nq=Zmp=Xkuk-pIN&o-= delta 2255 zcmV;=2r&2c{S)o|6ObYqGczwpAX^|gH!&bLGBhAvFH9gaGB-3ZHIX|W0yZ?UTQ~s? zG%rwcWp*GlGB!0fHItwLLVr0Rl64x0EZ+$tnG`@IV*r@60+V52@iZ{G21Ig2f=C7% z5Xq+rB6)9tNN%vn+|pq3KbTYnt9c0`1*Ri(F@nrt4U=F3(vvd-!2vdt z^#ebD9beppJ;x6QNGLFRu-q~~4pb6#dc!KMbt~8cb_g^&vkPcM99-N!K`BIFQcB|# z{R0XChopBDy}W&V{rm&X90w=6os+exWfJkYr0O%*X{y&X-53r@r$0=rJc_&9_2%xW z`uT^$VCk9JR#iYHY5_}wwswc>Cmfw@)*H=##1^ohq0yNm@8Rj?`Em!ExnfRkUVdkH zCD5?TnjveGuAY@T+$m;KDU=FUsmRnOaQEB4wC6XDuGHioFD)$E_0gXi7JC-GHAKws2^qp(>^!5pXMQ$^_mS&58 zt;vpD_Y@&J%w93lp7?__qBeSH1= z16U=(f1cMj=e>Q79cGF#D!oHQ3ifa=6e%3B7`@nEC_H|(KubCgJDj= zf-`~fNe5d?xdo(G*l{pga2B$AK6Chg&SJ{Iz!<~8z`g;f(}96Om0=Cz2>}j?3x*2P z2c#Mt89y;kV3%NUuvoyuP|3i;$iX;;fq^MNAR(#Y1mir$)%Q3!UOf2V=4;h(dRa6} z6{F=W4h8|92Mi7d4U7yvj4v2Bh&y{QR5)l!@-xe^C@>gs1aK!XI0!S!F>e4}8pXks zVAddX?m|NY!vzKwW(NiVE(f42&?}D^d6*;^5(E|ivq^&*cMzu6XELy?^8(VGAP#FF z12>Rj!c>;yyq5Kls}zHPWI1aBkUyP)WzBRT%?L!U0JrJi0<($++A!!UKm3)|`(|k}UA42OzRAqC=+)(l-dD?dRa9#_FRHX^ zi_?BsG_CD#bVC9`(a^xO%cj`bx^bC>S_xF?9%Mfp^JtO~GZAlbs{ zJGKjIUaah<%>`rR*Z?eE~<2zDB0i+~AMRG3@vG5v9kO)xV)}DX&$15A*YhQ{; z6_8K~cRs?m@VR}S`gJlkljAEufJ z=X2U0wXRQ2C7AXn11EpNTDTqqk!LX1YRByfL}^p#vMc8#qlg6vL{}E2P{+Wntorq79e4)XkYK%n_|7OB!WKjxrMSsj1Eh^Zb|4O z==JL7yo2Y$afW(ZlyF;26gg&fl3jaYQ5u-5Lb}T#=Rt4H>#QPw?tQ~G=-BGASfMebLMTUv z#1Z}2>a{^7Ab$#W?@I=ZV?~A|PzMu^>8Kxm(+A*xD$IYtMsnuj4<~ze>Z)2gQaKrzgTVynFOcD9KEa_+VCs|O z)ITExzMDc_BINDw1*&DXF?P8*e!*T~Nd15zj~dR^&rm}@cUKJ){<>gq6zG4J!fSpC zWo~41baI!t*aQrRp)mo6p)mr7p)muup)myH$^kf&paB$@n*0PJf0D~9gi#pA-}f_S zurOIrh?TNNlwm7HDT+omE(^IfQEp)+k_9EXET};iE-9rfC<_Za$%?g&vak`Q==_E` zr*HlN-{RNPbDr~__dDSvrg8De>E`bRKpLh+D_z{3KuwWo5>hT z$;6$E)1h|5qGVnpIZhAk4a}zWQ031^E_%>vS#kV+$LF490Dpm5| zhM({Q=EFx=2SeoXg*Tv6{&RH$?r>t_C2;@BT*lY!tivU&f7TmTe&ZjR`zej#x8U>` zR?wmF7dmaVj5#`SSIg)|Dl8fnw4&ef`*1i{_v~Dx5WNLsDK#so@QTC#s { }); }); +describe('/GET convertHTML/filename', () => { + it('it should GET a converted PDF document from HTML', (done) => { + chai.request(server) + .get('/convertHTML/myhtml-index.html') + .end((err, res) => { + chai.expect(res.status).to.equal(200); + chai.expect(res.type).to.equal(mimeType['.pdf']); + done(); + }); + }); +}); + describe('/GET generate/filename', () => { it('it should GET a newly generated PDF document', (done) => { chai.request(server) diff --git a/tools/copy-pdfnet-lib.js b/tools/copy-pdfnet-lib.js deleted file mode 100644 index 9155f41..0000000 --- a/tools/copy-pdfnet-lib.js +++ /dev/null @@ -1,12 +0,0 @@ -const fs = require('fs-extra'); - -const copyFiles = async () => { - try { - await fs.copy('./node_modules/@pdftron/pdfnet-node/lib', './pdfnet-node/lib'); - console.log('PDFNet files copied over successfully'); - } catch (err) { - console.error(err); - } -}; - -copyFiles(); \ No newline at end of file