pofider / phantom-html-to-pdf Goto Github PK
View Code? Open in Web Editor NEWHighly scalable html to pdf conversion using phantom workers
License: MIT License
Highly scalable html to pdf conversion using phantom workers
License: MIT License
fs.writeFile('t1.pdf', pdf.stream)
I tried this but it seems not a right way to generate pdf file.
We are currently using phantom-html-to-pdf to generate a user report pdf, but on one specific linux server running nginx we're getting a 504 timeout error no matter what we try. It is as if it never gets to startup phantomjs. There aren't any errors (except timeout) in any of our logs or anything.
We have a different server running almost the exact same setup, where the setup works completely fine. The server where it doesn't work is a more closed test server, where only a selected range of IP-adresses have access. Other than that we can't find any noticeable differences that should affect this package.
We have tried to specify a port range and opening access for localhost requests in that range in the nginx configuration, but without luck. All localhost access should already be accepted, but we tried it nonetheless. We also tried changing the node version around to see if that had any effect, which it didn't. Giving the package a larger timeout in the global setting didn't change anything but the amount of time it took before the timeout error page was displayed.
Our implementation looks like this:
var converter = require('phantom-html-to-pdf')({
host: '127.0.0.1'
});
converter({
html: html,
header: '<div>{#pageNum}</div>',
footer: '<div></div>',
waitForJS: true,
waitForJSVarName: 'PHANTOM_HTML_TO_PDF_READY',
allowLocalFilesAccess: true,
paperSize: {
format: 'A4',
orientation: 'landscape',
margin: '0.5in',
headerHeight: '0.3in',
footerHeight: '0.7in'
},
settings: {
javascriptEnabled: true
},
format: {
quality: 100
},
phantomPath: require('phantomjs-prebuilt').path
}, function(err, pdf) {
if (err) {
console.log(err);
return;
}
console.log(pdf.logs);
console.log(pdf.numberOfPages);
pdf.stream.pipe(res);
});
Here's some server information which could be useful:
We are currently running out of ideas and hoping that someone could help us figure out what we can do to fix this?
Hi, sorry for stupid question, but how to:
window.PHANTOM_HTML_TO_PDF_READY = true;
in html script tag)The generated pdf does not render the images that are in the html, although the temporary generated html file does display them properly. Is there a special settings or method to have them in the pdf?
I'm working on a web application using phantom-html-to-pdf, localmente works but in production the following error occurs
Error during rendering report: spawn /opt/venfi/node_modules/phantom-html-to-pdf/node_modules/phantomjs/lib/phantom\phantomjs.exe ENOENT
Centos
Node v6.10.3
Any idea what could be the issue here?
Thank you.
At times, script references are not loaded and ajax requests return http
status 0 with body.settings.resourceTimeout 1000.
The idea is that this timeout is configurable?
i used below code to replace the file names with absolute file path, still it is giving me protocol is unknown, i have font files, image files to include in pdf
var dirName = path.join('file://', __dirname);
dirName = dirName + '/';
html = html.replace(/src="/g, 'src="'+dirName).replace(/src: url(/g,'src: url('+dirName);
We need to set the content of the footer as part of the paperSize call (in order to add page numbering), so I want to be able to set up the config below.
paperSize: {
format: 'A4',
orientation: 'portrait',
footer: {
height: '1cm',
// Pass as a string to overcome a limitation of node-phantom
// See description here: http://stackoverflow.com/questions/17102287/footers-contents-dont-seem-to-work
contents: 'function(pageNum, numPages) { if(pageNum > 1) { return \'<div style="text-align: center;font-family:Arial;font-size:12px;color:#333">\' + pageNum + \'</div>\'; } }'
},
margin: {
top: '2cm',
left: '2cm',
right: '2cm',
bottom: '1cm'
}
},
Unfortunately, it seems there's no support for footer
. I'm going to take a look under the hood now to see if I can suggest a solution :)
I am using "phantom-html-to-pdf" to convert to PDF the HTML output of my process. The HTML has 2 images and they are not printed. Instead i get a rectangle where the image is supposed to be printed and also in a wrong location.
wrong-output.pdf
If i decided to press CTRL-P i can print the HTML output using my PDF Printer without any issue.
correct-output.pdf
Is there any reason why you think is doing this? Is there any trick to enable the printing of the images and CSS associated to the HTML?
Regards,
Hello,
Your library works perfectly locally but when used in openshift, I encounter trouble.
I receive this error. Do you know why ? Is it possible to configure your package to use specific ports ?
events.js:72
throw er; // Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:905:11)
at Server._listen2 (net.js:1024:19)
at listen (net.js:1065:10)
at net.js:1147:9
at dns.js:72:18
at process._tickCallback (node.js:442:13)
I've read this interresting article in which they say that phantom generates a little local server bind to localhost. Openshift does not allow that.
I was wondering if there is a way to initialiez your package with another variable that localhost ?
I have tried initializing the library using this :
var conversion = require("phantom-html-to-pdf")({
host: process.env.OPENSHIFT_NODEJS_IP,
phantomPath: require('path').dirname(process.env.PHANTOMJS_EXECUTABLE) + '/'
});
But his does not work.
Using the library with this :
var conversion = require("phantom-html-to-pdf")({
strategy: "dedicated-process"
});
Is working locally but not in openshift.
In openshift, I receive a "failed to load pdf error" from my browser but no error server side ...
Depending on your host system you must install fontconfig or libfontconfig to make phantomjs works. This is not automated in installation script.
On Centos:
sudo yum install -y fontconfig
On Debian/Ubuntu:
sudo apt-get install -y libfontconfig
Maybe a note on the README is necessary (to avoid loosing 3 hours as me...).
Hi Team,
We are facing issue regarding extra spacing between characters while generating pdf in redhat. When the pdf is generated through MAC/Windows, Every character looks as it is displayed in html. We have already ran the command "yum install fontconfig freetype libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6".
Please suggest whats wrong with the setup.
Attached is the pdf which was generated.
Thanks.
HealthReport-1.pdf
Love the concept of this module - exactly what we needed :)
Have just overcome an issue:
numberOfWorkers: 6
, and hit the error pasted in belowstrategy: 'dedicated-process'
Might be a documentation issue?
Would also love some guidance on how many workers a standalone server with X GB of RAM can handle...
Hi there,
I can't make phantom-html-to-pdf works in a dockerized environment. I run the nodeJS docker image named node:7.4-alpine which runs an application containing phantom-html-to-pdf.
Each time I try to generate a pdf I've got an exception:
[2017-01-24 07:27:21.245] [ERROR] cld-apps.services.invoices - Could not generate invoice pdf cause "{ Error: connect ECONNREFUSED 127.0.0.1:34315
at Object.exports._errnoException (util.js:1022:11)
at exports._exceptionWithHostPort (util.js:1045:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1090:14)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 34315 }"
[2017-01-24 07:27:21.247] [ERROR] cld-apps.core.express - { Error: connect ECONNREFUSED 127.0.0.1:34315
at Object.exports._errnoException (util.js:1022:11)
at exports._exceptionWithHostPort (util.js:1045:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1090:14)
From previous event:
at exports.previewInvoiceDoc (/home/clduser/cld-apps/packages/invoices/server/controllers/ctrlInvoiceDoc.js:439:4)
at Layer.handle [as handle_request] (/home/clduser/cld-apps/node_modules/express/lib/router/layer.js:95:5)
at next (/home/clduser/cld-apps/node_modules/express/lib/router/route.js:131:13)
at /home/clduser/cld-apps/packages/system/server/oauth2/middlewares/authorization.js:184:12
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 34315 }
Of course this works well outside a container.
Any clues to make it works ?
EDIT:
My piece of code:
var conversion = require('phantom-html-to-pdf')({
/* number of allocated phantomjs processes */
numberOfWorkers: jmcnetConfig.getInt('commons.phantomJS.poolSize', 2),
/* timeout in ms for html conversion, when the timeout is reached, the phantom process is recycled */
timeout: jmcnetConfig.getInt('commons.phantomJS.timeout', 10000),
/* directory where are stored temporary html and pdf files, use something like npm package reaper to clean this up */
tmpDir: jmcnetConfig.get('commons.phantomJS.tempDir')
});
...
conversion({
html: helperInvoice.getHtmlInvoiceFromTemplate(context, templateName, template.template, 'server-messages'),
header: helperInvoice.getHtmlHeader(context, templateName, template, 'server-messages'),
footer: helperInvoice.getHtmlFooter(context, templateName, template, 'server-messages'),
paperSize: {
format: template.paperSize,
margin: template.margin,
orientation: template.orientation,
headerHeight: template.headerHeight,
footerHeight: template.footerHeight
}
}, function (err, pdf) {
if (err) {
log.error('Could not generate invoice pdf cause "%s"', dbg(err)); <--- we see this log
deferred.reject(err);
} else deferred.resolve(pdf);
});
I want to use this module for creating pdf file. but with a functionality of password protection. can we do that using this module?? or not?
Currently we are just ignoring the ouput from phantomjs. The output can contain very important messages which should be provided to the caller.
Hi,
is there any way to shutdown the server ? I tried to kill all worker but no luck.
It could support background like Background-layer in pdfmake.
Thanks.
Hi,
I have a file system watcher that watch a folder. When a file is detected, I read the file and I convert it into PDF with phantom-html-to-pdf.
My concern is when too many files is handled, Phantomsjs crashs.
I would like tell at phantomjs to manage a maximum 20 files for exemple. Is it possible?
Or would you advise me how I can make this without this error?
Thanks
Now trying to run my server on an AWS instance running ubuntu, and hitting:
Debug: internal, implementation, error
TypeError: Uncaught error: Cannot read property 'stream' of undefined
at /var/apps/pdf-generator/index.js:88:14
at /var/apps/pdf-generator/node_modules/phantom-html-to-pdf/lib/dedicatedProcessStrategy.js:31:24
at ChildProcess.exithandler (child_process.js:641:7)
at ChildProcess.EventEmitter.emit (events.js:98:17)
at maybeClose (child_process.js:743:16)
at Process.ChildProcess._handle.onexit (child_process.js:810:5)
Here's my simple server:
'use strict';
var Hapi = require('hapi');
var htmlToPdf = require('phantom-html-to-pdf')({
numberOfWorkers: 6,
strategy: 'dedicated-process'
});
var server = new Hapi.Server();
server.connection({
// host: 'localhost',
port: 3000
});
// Inert required to return a file: http://hapijs.com/tutorials/serving-files
server.register(require('inert'), function (err) {
// Add the route
server.route([
{
method: 'GET',
path: '/pdf',
handler: function (request, reply) {
generatePdf(request.url.query.url, reply);
}
}
]);
// Start the server
server.start(function () {
console.log('Server running at:', server.info.uri);
});
});
function generatePdf (url, reply) {
console.log('Rendering', url);
htmlToPdf({
url: url
}, function(err, pdf) {
reply(pdf.stream).type('application/pdf');
});
}
Any ideas what could be leading to this issue?
Unlike locally, changing the strategy doesn't seem to make any difference :(
┌───────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ │ Remote Memory Exposure │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Name │ request │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ CVSS │ 5.3 (Medium) │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Installed │ 2.42.0 │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Vulnerable │ >=2.2.6 <2.47.0 || >2.51.0 <=2.67.0 │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Patched │ >=2.68.0 │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Path │ XXXXXXX > [email protected] > [email protected] > [email protected] │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ More Info │ https://nodesecurity.io/advisories/309 │
└───────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
┌───────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ │ Regular Expression Denial of Service │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Name │ hawk │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ CVSS │ 5.3 (Medium) │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Installed │ 1.1.1 │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Vulnerable │ < 3.1.3 || >= 4.0.0 <4.1.1 │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Patched │ >=3.1.3 < 4.0.0 || >=4.1.1 │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Path │ XXXXXX > [email protected] > [email protected] > [email protected] > [email protected] │
├───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ More Info │ https://nodesecurity.io/advisories/77 │
└───────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘```
I'm a bit confused that I can't see numberOfWorkers
anywhere in the codebase aside from the README and a place where it's assigned to an options object. It seems unused.
It's also not in PhantomJS itself.
I'm sure I'm missing something :) If it isn't doing anything this project doesn't seem to match the README (e.g re options nor FIFO?).
I'm trying to create a report that has the current date and time and displays some names provided in the data.
Hi, not sure where else to post this, but i need the ability to include a cookie when phantom js requests a file. I can see how i might do this by modifying your source code (which i'd rather not do), but i cannot work out where/how and in what format to supply cookies in the initial conversion function.
Below is the code i am using, i'd assumed i could just pass a cookies property in the options object. Tried several different formats, and tried to trace through your code but had no luck.
conversion({
url: request.post.location',
// waitForJS: true,
// waitForJSVarName: 'ready_to_print'
}, function(err, pdf) {
console.log(pdf.logs);
console.log(pdf.numberOfPages);
pdf.stream.pipe(response);
});
Tried:
cookie: [[name, value]]
cookie: [{name: name, value: value}]
cookie: ["name=value"]
None of the above worked.
I've looked at phantomjs itself which recommends using addCookie methods, but since i dont have access to the phantom objects themselves, im not sure how to go about this (again without modifying the code).
thanks!
Callem.
When we upgraded from 0.3.5 to 0.4.1, we are noticing that tags are failing to render properly.
We are using express 4 and an interesting quirk we noticed is that the pdf will render properly if we first pass the html fed to the phantom server in our express app. So, for example, in the code below, the image renders appropriately if we make a request to '/page' and then '/file' but not if we just call '/file'
var converter = require("phantom-html-to-pdf")()
app.get('/page', function(req, res, next) {
var htmlForPdf = _.template(loadTemplate('pdf_report.html.erb'))()
res.render('pdf', {pdf: htmlForPdf})
})
app.get('/file', function(req,res,next) {
var htmlForPdf = _.template(loadTemplate('pdf_report.html.erb'))()
converter({html: htmlForPdf}, function(err, file) {
file.stream.pipe(res)
})
}
I tried to put some custom fonts in HTML. It seems to work in general, but it doesn't work when italic style is desired. Italic style works for standard fonts but not for custom.
Font face declaration:
@font-face {
font-family: 'FontBI';
src: url('FontBI.TTF') format('truetype');
font-weight: 400;
font-style: italic;
}
HTML:
<div style="font-family:'FontBI'; font-style:italic; font-weight:bold;">
Italic Font test
</div>
Font-weight:bold is working, but font-style:italic isn't!
Any ideas how to solve this or it is a bug in phantomjs?
PhantomJS allows for the possibility to inject JS files into the page. I couldn't find this functionality here. If it fits the roadmap I could submit a PR, but I don't have a good solution on how to unit test this.
The edit is contained in the lib/scripts/conversionScriptPart.js
:
Adding these lines to the page.onInitialized
function
if (body.injectScripts && body.injectScripts.length > 0) {
body.injectScripts.forEach(function(script) {
page.injectJs(script);
});
}
This functionality could then be triggered by calling conversion
like this:
conversion({
url: "http://example.com",
injectScripts: [
__dirname + '/polyfill.js' // <-- include the full path to the script(s) to be injected
],
waitForJS: true
}, function(err, pdf) {
...
})
Thoughts?
Here is the code that I'm using to render the HTML file (published here) - https://redhat-microservices.github.io/lab_swarm_forge-keycloak/
var conversion = require("phantom-html-to-pdf")();
var fs = require('fs');
var res = fs.createWriteStream('generated_content/hol.pdf');
var src = fs.readFileSync('/Users/chmoulli/MyProjects/litoria/generated_content/hol.html');
conversion({
html: src.toString(),
allowLocalFilesAccess: true,
format: {
quality: 100
}
}, function(err, pdf) {
console.log(pdf.logs);
console.log(pdf.numberOfPages);
pdf.stream.pipe(res);
});
The pdf file generated looks good excepted that the links aren't clickable
I have some stuff that needs to fetch images dynamically, is there any way to wait until it all is rendered before printing?
Is there anything blocking this module (or others like phantom-workers) from having the dependency for PhantomJS updated to the 2.x series?
I have added couple of images in the HTML template, the text in generated PDF is not selectable, however if there are no images, then the text is selectable.
Bold attribute or of HTML doesnt work with this.
Trying to run this in docker gives me
/node_modules/phantom-html-to-pdf/lib/conversion.js:83
if (opt.phantomPath) {
^
TypeError: Cannot read property 'phantomPath' of undefined
at module.exports (/node_modules/phantom-html-to-pdf/lib/conversion.js:83:12)
at Object. (/lib/index.js:11:45)
at Module._compile (module.js:397:26)
at Object.Module._extensions..js (module.js:404:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object. (/example/index.js:2:15)
at Module._compile (module.js:397:26)
any ideas?
Hi ,
I am using this module to convert html string to PDF file in node.js like this,
var htmlstr="<h1>Test</h1><p>Hello world</p>";
var conversion = require("phantom-html-to-pdf")();
conversion({ html: htmlstr}, function(err, pdf) {
console.log(pdf.logs);
console.log(pdf.numberOfPages);
pdf.stream.pipe(fs.createWriteStream(__dirname+'/destination.pdf'));
});
after that I viewed pdf file ,in that the text is not showing .
Hello, thanks for the package!
I'm using chart js to create charts in my site, then i'm converting it to base64 and send it to the server for the pdf creating. the quality is much worse than in the site. do you have any idea why?
the pdf:
204026330_concentration (4).pdf
the site:
macOS Sierra 10.12.3
node 6.9.1
phantomjs: 2.1.1
var app = express();
app.get('/', function (req, res) {
var conversion = require("phantom-html-to-pdf")({
timeout: 5000
});
conversion({ html: "<h1>Hello World</h1>" }, function (err, pdf) {
if (err) {
console.log(err);
res.status(200).send(err);
} else {
console.log(pdf.logs);
console.log(pdf.numberOfPages);
pdf.stream.pipe(res);
}
});
});
result
{ Error: connect ECONNREFUSED 127.0.0.1:56033
at Object.exports._errnoException (util.js:1026:11)
at exports._exceptionWithHostPort (util.js:1049:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1085:14)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 56033 }
And the port number keeps changing?
Any help on that please?
The links referencing other part of the page (ex:
Thanks for both the tool and answering earlier issues today!
I have a webpage that downloads a set of files and then runs a script to translate the content to the right language. This works great, unless the PDF is generated before the content has been translated.
conversion.printDelay is useful, but isn't reliable enough.
Instead, I want to run a custom JS test to check whether or not the page has actually been loaded. If it hasn't, then I'd wait 100ms and try again. This polling technique is common with Selenium-based testing frameworks (e.g. Protractor).
I'm going to be looking into this tomorrow, so any guidance on how to implement this with (or as an extension/pull-request for) phantom-html-to-pdf would be very welcome :)
Hi there,
For Document Management System (DMS), we need to get some PDF/A documents to be generated. Cf. https://fr.wikipedia.org/wiki/PDF/A-1
Is there any plan to support this format ?
Many thanks for your response.
Hi,
I would like create a dynamic header and footer for the last page. It is possible?
I saw that I just can create the same header and footer with local options.
Thanks
Hello,
I've trid your solution and I issue this error when trying your sample code:
[2015-03-31 08:21:33.153] [ERROR] cld-apps.services.invoices - Could not generate invoice pdf cause "{ [Error: connect ECONNREFUSED] code: 'ECONNREFUSED', errno: 'ECONNREFUSED', syscall: 'connect' }"
Any clues of what happens ?
My piece of code:
var conversion = require('phantom-html-to-pdf')({
numberOfWorkers: 2,
timeout: 5000,
tmpDir: '../temp'
});
exports.downloadInvoice = function (req, res, next) {
log.info('Downloading invoice "%s (%s)"', req.invoice._id, req.invoice.number);
conversion({ html: '<h1>Hello World</h1>' }, function(err, pdf) {
if (err) {
log.error('Could not generate invoice pdf cause "%s"', util.inspect(err));
return next(new jmcnetException.TechnicalException(err));
}
log.debug('pdf is "%s"', util.inspect(pdf));
pdf.stream.pipe(res);
});
};
Hi,
I am wondering if it is possible to reset {#pageNum} variable in footer? There is requirement for mass PDF generation and that includes page numbering. So everytime there is content for new PDF, pageNum should be reset to 1. That would be convenient for printing large number of PDFs (so all PDF will be in one file).
Is there any option for that? What about merging PDFs with that library?
Thank you for any answer.
I've installed and used the package as noted for macs - phantomjs-prebuilt.
But the rendered pdf file does not have any text on it. Can you please advise what to do in this situation?
There should be limit for maximum size of debugging messages transferred from phantomjs. Many console.log
calls can currently cause errors in http as well as stdout transfers.
The only way I've found to inyect a picture in the header is also necessary to put it in the body with none display.
Hi, thanks for a great library. It works, but I have the problem. When requests for images are made ( tags) cookies are not sent and headers as well.
Here is an example.
return htmlToPdf(
{
settings: {
javascriptEnabled: true,
resourceTimeout: 10000
},
cookies: [{
name: 'cookie-name',
value: 'cookie-value',
path: '/',
domain: 'domain.com'//Leave blank when working on localhost - "." will get prepended to domain
}],
customHeaders: headers,
html: html,
format: {
quality: 100
}
},
function (err, pdf) {
console.log(pdf.logs);
console.log(pdf.numberOfPages);
pdf.stream.pipe(writableStream).on('finish', () => {
callback(filename);
});
});
I have tried to debug requests using an intercepting proxy software, but neither headers nor cookies are sent when requests are made to download images.
How this problem can be solved ?
I'm running the package in a heroku dyno and I'm trying to find a way to get logs from the template picked up by phantom and shown in my heroku console,
I tried adding this to the serverScript.js
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
but that didn't work..
I haven't worked with phantom at all before.
Add option for pdf quality
Actually the module create temporary file (html, and pdf) for the generation of the pdf.
Can the plugin remove them when the pdf is created (or in case of fail) ?
Thanks
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.