
Show HN: Pdf.js Express – PDF annotation, e-signatures, and form filling - niknikson
Hi HN,<p>Nick here. We&#x27;re super excited to officially launch PDF.js Express [1].<p>PDF.js Express wraps a modern React UI around the PDF.js rendering engine to enable PDF annotation, form filling, and signing inside your web app. We&#x27;ve also made some improvements to PDF.js text search, and taken a different approach to how the viewer uses the PDF.js rendering API, resulting in sharp graphics at any zoom magnification [2].<p>Based on our research, more than 70% of those who try to implement these features on top of PDF.js find it too difficult or time-intensive [3]. For those who are successful, supporting the new functionality is also challenging. To help these developers in achieving their short-term goals, and to support them as their needs evolve, we built PDF.js Express.<p>Check out the demo and let us know what you think or if you have any questions [4].<p>If you&#x27;re helping fight COVID-19, it&#x27;s free [5].<p>[1] <a href="https:&#x2F;&#x2F;pdfjs.express&#x2F;blog&#x2F;introducing-pdfjs-express" rel="nofollow">https:&#x2F;&#x2F;pdfjs.express&#x2F;blog&#x2F;introducing-pdfjs-express</a><p>[2] <a href="https:&#x2F;&#x2F;pdfjs.express&#x2F;pdfjs-vs-express" rel="nofollow">https:&#x2F;&#x2F;pdfjs.express&#x2F;pdfjs-vs-express</a><p>[3] <a href="https:&#x2F;&#x2F;pdfjs.express&#x2F;blog&#x2F;build-vs-buy" rel="nofollow">https:&#x2F;&#x2F;pdfjs.express&#x2F;blog&#x2F;build-vs-buy</a><p>[4] <a href="https:&#x2F;&#x2F;pdfjs.express&#x2F;demo" rel="nofollow">https:&#x2F;&#x2F;pdfjs.express&#x2F;demo</a><p>[5] <a href="https:&#x2F;&#x2F;pdfjs.express&#x2F;blog&#x2F;pdfjs-express-free-to-those-fighting-covid-19" rel="nofollow">https:&#x2F;&#x2F;pdfjs.express&#x2F;blog&#x2F;pdfjs-express-free-to-those-fight...</a>
======
IvanK_net
I spent about three years building the support for PDF into my graphics editor
[https://www.Photopea.com](https://www.Photopea.com) .

While other editors "add stuff on top of PDF", Photopea "chews through" each
byte of a PDF, and tries to make as much sense of it as possible.

You can rewrite the existing text (with the same formatting), edit bézier
curves, edit gradient fills. You can edit bitmaps on a pixel level. You can
see the parameters as CSS or export it into an SVG.

Also, it is free. People open about 150,000 PDF files a month in it, but I
hope it will get more popular in the future.

Demo PDF: [https://www.photopea.com/api/img2/WEBSITE-ZLONIN-
uprava.pdf](https://www.photopea.com/api/img2/WEBSITE-ZLONIN-uprava.pdf)

Photopea:
[https://www.photopea.com#%7B%22files%22:%5B%22https://www.ph...](https://www.photopea.com#%7B%22files%22:%5B%22https://www.photopea.com/api/img2/WEBSITE-
ZLONIN-uprava.pdf%22%5D%7D) (press T and click into the text to edit it)

~~~
chrischen
Wow nice. I was just about to cancel my Photoshop subscription because 1) I
hate subscription pricing models and 2) I'm using it mostly just to resize
images.

Nice to see that you have the Photoshop UI there so I don't have to relearn
anything.

~~~
necovek
I understand a professional not wanting to learn a new UI for something as
complex as graphics editing, but if you are admittedly mostly using it to
resize images, I can't imagine why any other tool, including the infamous
Gimp, would be so hard to "learn"?

~~~
chrischen
I think I was overstating the extent to which I _only_ use it for resizing
photos.

------
martinald
Some feedback.

Website design is poor. You could definitely do with a designer to make it
look nicer.

$5000ish a year is a weird price point. It's too expensive for a hobbyist or
small dev shop, but too cheap for an enterprise to buy (when you consider the
time of working on procurement problems you'll experience).

You either need to make it cheap, like $200/yr, or much more expensive. Right
now you are in no mans land.

You also have a * next to limited support on pricing page, but I can't see
what that explains.

Offering no refunds is strange and your copy comes off passive aggressive
about this. Why? As a new service I'd be all about offering full refunds with
no questions asked. Most people don't ask for refunds, and you can learn very
important information when they ask for one.

Terms page is very short and doesn't have a lot of terms I'd expect for a
product charging $5k/yr.

Don't worry about it not being open source; that's fine.

~~~
bassdigit
> Website design is poor. You could definitely do with a designer to make it
> look nicer.

Really, in what way? In my view it's clean and simple.

> You either need to make it cheap, like $200/yr, or much more expensive.
> Right now you are in no mans land.

Another unsubstantiated statement. How much market research have you done on
PDF libraries?

Pricing is a sensitive topic and many factors play a role in it. Too many to
be assessed by an armchair expert.

> Don't worry about it not being open source; that's fine.

Where did OP express any worries about it not being open source?

------
spankalee
Nicely done!

For non-React users (and React users, for that matter), I started working on
wrapping PDF.js up into a web component for use in any framework or in plain
HTML or Markdown: [https://www.npmjs.com/package/pdf-viewer-
element](https://www.npmjs.com/package/pdf-viewer-element)

The idea is to make a `<pdf-viewer>` element that's as easy to use as if it
were built-in to the browser.

As PDF.js Express shows, this is a pretty deep UI and feature area to tackle.
My project is incomplete and doesn't have anywhere close to the features.

I think complex viewers are one of the ideal use cases for web components
though. These components require a lot of work to do well, and we shouldn't
have to re-implement them for every framework. The 3D gltf viewer, `<model-
viewer>`[1] is another great example.

[1]: [https://modelviewer.dev/](https://modelviewer.dev/)

------
transitivebs
I'm all about the open core business model.. but are you guys affiliated with
the core pdf.js team?

$440 / month is pretty hard to swallow. I love that you guys included a build
vs buy section, but I think it's going to be difficult to land clients at this
price point because higher end clients are more likely to choose the build vs
buy option.

Anyhow, the product itself looks well structured. Congrats & best of luck.

~~~
niknikson
Thanks for the feedback! We are not part of the core pdf.js team. In regards
to pricing we found that for some companies creating their own viewer requires
a fair amount of upfront resources - after trying to create their own viewers
they realized the time to build and maintain was not economical. The other big
consideration is the opportunity cost of sinking developer resources into a
viewer that is not a core differentiator.

~~~
ipsum2
It's super misleading to call yourself "PDF.js Express" then. It sounds like a
paid extension to PDF.js. You should rename the product.

~~~
drannex
Right there with you. This is straight up infringement and confusing for
everyone involved. This should not be allowed in the slightest. Highly
disingenuous for them to do this.

------
antoineMoPa
This reminds me of the people who tried to sell Blender a couple of years ago
[0].

[0] [https://www.blendernation.com/2009/06/11/3dmagix-re-
branding...](https://www.blendernation.com/2009/06/11/3dmagix-re-branding-and-
selling-the-free-software-blender/)

~~~
robocop2018
Or Linux Red Hat, iText Lib ( open sourced but under AGPL) etc. There is tons
of open-source out there under commercial terms.

~~~
lorenzhs
Yeah but this isn't open source. It's proprietary with source available,
despite what you claim in numerous places throughout this thread. You're
building a proprietary product on top of an open source project. You also
chose a name that creates the impression that you built the original open
source project, which you don't appear to be contributing anything back to.
Comparing yourselves to Red Hat has to be a joke, right?

~~~
robocop2018
No, Express will be available under dual AGPL/commercial license.

------
2pointsomone
I have a startup and we are highly reliant on PDF rendering in our
application. But here's the thing, Nik: your pricing model doesn't make sense
to me. In general, most PDF SDK models don't make sense. I have searched a lot
over the years, and am left consistently disappointed.

You charge the same amount to large commercial customers as you do to small
startups, who are trying to save every penny. Even though I really value the
technology you have built, you have not allowed us to "pay-as-we-go". I am not
interested in your trial and the trials of your competitors because you don't
allow me to start with a $5/month plan based on volume of usage. And so, we
have resorted to writing the wrappers around PDFJS ourselves, slowly and
steadily over months and years. Even though we might end up spending the same
amount over 2 years by doing these things ourselves, at least we will
understand the technology and own it perpetually.

Just charge us based on volume, so your revenue can align with our revenue. It
will create much larger traction among small developers. If you are not
targeting that audience, I understand, but I contend that most people on
places like HN are that audience. Be more like Crocodoc (the company Box
acquired). I really don't want us to keep reinventing the pieces here because
this is not our core competency.

~~~
niknikson
The biggest challenge to pricing based on volume is the exercise of tracking
usage. In a typical SAAS product determining usages is fairly linear. For
PDF.js Express because you would be deploying from your environment we would
not have an accurate way to measure usage. Fundamentally I agree with you -
you should pay for what you use. Unfortunately at this time we are not able to
implement that effectively. Also keep in mind for some organization the value
created from this product will far outweigh the final price tag.

~~~
2pointsomone
Good point. What if you have two models:

\- One: the model you have right now. this is for organizations where the
value outweighs the price tag.

\- Two: Smaller organizations are generally also more willing to compromise on
JS/asset bundling and performance. Why don't you give them: \- a hosted JS
solution where they just have to include a <script /> tag \- An uglified
script. I'd argue most JS developers can't unscramble these \- you keep
counters on number of requests \- you disqualify (using some basic hashing
method) run-ability of PDFJS Express based on the time the script was
requested OR if an acknowledgement from a server fails. So say, if someone is
using a cached version, the script will either not run at a certain point OR
all the documents will be watermarked with "TRIAL".

This second way could also be the best way for getting people started
immediately. Include a tag, see a watermark, but you are ready to go.

~~~
lukevp
The watermarking is how Google Maps does it. It shows "development only" on
the maps if the keys are not set up right or are over their limits.

------
phonon
FIle is here [https://registry.npmjs.org/@pdftron/pdfjs-express/-/pdfjs-
ex...](https://registry.npmjs.org/@pdftron/pdfjs-express/-/pdfjs-
express-6.2.1.tgz)

They bundle both a Apache 2.0 "PDFJS-LICENSE" AND a "PDF.js Express Evaluation
License.pdf" which seem to conflict with each other.

~~~
williamstein
I suspect that the Apache license is meant to only apply to the PDFJS source
code, and the "... Evaluation License" applies to the minified/bundled pdfjs
express code that's in there (but not actually human readable?). That's my
guess.

~~~
phonon
I think you're right, but how is someone supposed to know which parts go with
which? I guess \pdfjs-express-6.2.1\package\public\core\pdfjs is Apache 2.0
and everything else is commercial?

------
itcrowd
Hi Nick,

Congrats on your launch. Just wanted to tell you that there's another service
called PDF eXpress that's in use for IEEE conferences to make sure the authors
conform to the given template. I know it's not exactly the same name, but
might be worth looking into viz. copyright or trademarks.

More info on PDF eXpress:
[https://www.ieee.org/conferences/publishing/pdfexpress.html](https://www.ieee.org/conferences/publishing/pdfexpress.html)

------
ggcdn
I work in an industry that marks up PDFs extensively (construction) and have
wanted to build a bespoke PDF markup tool for a long time. In designing
concrete floor slabs, we need to transfer information from our FEA software to
a dwg. Currently a blank plan is printed, it’s marked up by hand, and then
handed to a drafter to put back into the computer. It’s a very inefficient
process. But all the SDKs are stupidly expensive (this one included). It’s
really surprising there isn’t something open source, given the importance of
PDF markup in many industries and businesses.

~~~
ct520
What's preventing this being done with a ipad, pencil, and a myriad of pdf
viewer/markup apps out there?

~~~
ggcdn
I didn’t clarify that the tool needs to store the information so it can be
imported into CAD, rather than just being hand scribbled lines and numbers.

~~~
ct520
Ahh gotcha. This should still be straight forward. Just don’t know of a
generic format to export overlays/cordinates.

Everyone has a opinion on how this should be done and measured and there are
different standards for pdf libraries and print etc. not complicated though.

~~~
ggcdn
That was my feeling as well - it’s not necessarily complicated, it’s just so
niche as to not have anyone making it. Today I found this GitHub repo which I
may try tinkering with on the weekend:

[https://github.com/highkite/pdfAnnotate](https://github.com/highkite/pdfAnnotate)

~~~
ct520
yeah, main things are tracking overlay collision, groups like radio buttons,
where you start your measurements from top left or bottom, dpi, and zoom
levels. built systems for it using itext and websupergoo abcpdf. (backend for
manipulating pdfs, tamper sealing etc.) and front end uses a image of the
rendered pdf page that was extracted. This is a bit different from pdfjs but
also scales well. PS pdf standards suck. :(

------
phonon
The form fill demo only prints a bitmap. Is that intentional? The quality is
completely unacceptable.

~~~
niknikson
Yes, unfortunately the printing is done with a bitmap because of the lack of
browser APIs to print scalable canvas content. It looks like our default print
quality is a bit on the low side though, so we'll probably change that. You
can use the API to increase the quality as well
[https://pdfjs.express/api/WebViewerInstance.html#setPrintQua...](https://pdfjs.express/api/WebViewerInstance.html#setPrintQuality__anchor),
for example instance.setPrintQuality(2).

~~~
phonon
Well, capturing a 72 dpi screenshot and converting to JPEG (which more or less
seems to be what you're doing) kind of makes the form filling pointless.
Fillable PDF forms exist so they can be printed (or saved and then printed,
which I don't think you have an option for either?)

------
longtermd
The pricing of 440 USD/month must be an April's joke. It might be worth 9
USD/month compared the many competitors and free solutions.

------
mmckelvy
RE: the "Extract & parse content" feature, does this mean you can parse and
extract data from PDF documents like bank statements or invoices?

~~~
niknikson
We can extract text and form data -- we'll try to get some documentation
around that in the next week or so.

~~~
saradhi
"can" \- easier said than done, especially tables.

I don't see it in the Demo. Did I miss it ?!

~~~
robocop2018
I don't think this solution is doing what you are looking for. To detect
tables reliably in PDF you need some heavy-duty AI like
[https://www.pdftron.com/pdf-tools/pdf-table-
extraction/](https://www.pdftron.com/pdf-tools/pdf-table-extraction/)

------
social_quotient
How would this compare to something like syncfusion pdf viewer -
[https://www.syncfusion.com/angular-ui-components/angular-
pdf...](https://www.syncfusion.com/angular-ui-components/angular-pdf-viewer)

It handles chopping up the pdf into pieces on the server as well as storage of
annotations and some other stuff. We just got done integrating this in to a
big MEANS stack app and hit a ton of challenges both client side and server.

On the client side we wanted to customize the annotation dialogs which
required a ton of hacking.( we upload images and video snippets and role based
access to annotations. We wanted to load two PDFs side by side and sync
scrolling (Notta). On the server we had to wrap their api in a proxy so we
could store annotations in Elastic etc. it was great in a lot of ways but a
ton of work in other areas.

Generally how do you compare?

How are viewer modifications handled?

Great job getting the product out the door. This is a great space.

------
richardkeller
This looks like a fantastic solution. If there were an affordable price point,
I would immediately implement this in the edtech platform that we're
developing, but the price point puts it completely out of our league for now.
(Especially given the exchange rate fluctuations we see as developers in South
Africa). Have you by any chance considered offering discounts to: 1\.
Educational institutions 2\. Startups (eg. us) Offering a free tier to
startups, or at a discounted rate would allow them to use the product and
become entrenched, by which point the full license would become easily
affordable.

Overall looks like a great solution, and definitely a gap in the market. On a
side note, I hit the "Try for Free" button on the home page and got a 404.

------
lucasverra
COngrats Nick ! I've tested the fill pdf demo on latest FF on WIN10.

I cann add characters; but cannot remove them with DEL or RETURN keys cc
[https://ibb.co/zX4LQwL](https://ibb.co/zX4LQwL)

Cheers

------
akdarrah
Hi Nick,

Your product looks pretty awesome. It's super polished for your initial
launch! Congrats!

I'm curious how long it took to build the product and how large your team is?
Do you have some initial customers?

I'm building a similar paid Javascript Library business
([https://www.dropkiq.com/](https://www.dropkiq.com/)). I would love to
connect if you want to share some ideas? Feel free to shoot me an email if
you're interested: adam@dropkiq.com

Adam

~~~
eob
Just wanted to say that both Dropkiq and website to market it look fantastic.
Really nice work.

If you're ever interested in licensing a version to work with custom grammars
(not liquid), I'd be interested! (email: ted AT instabase.com)

~~~
akdarrah
Thanks, Ted! I appreciate the kind words.

I'll keep your email handy if we're able to help down the road with non-liquid
grammars.

------
ct520
I almost feel like this should be a product that integrates with industry
leading API's and be licensed as a better white label, then get those
enterprises into maintenance contract. Lot of companies I have spoken to want
to "own" the process all the way through and create a seamless "in their
portal experience" for interacting with PDFS. (tagging/signing/SSO/workflow
etc)

------
williamstein
Wow, if only this was open source...

~~~
robocop2018
It's open source.

~~~
williamstein
Their website and marketing of this fact (is it a fact?) is very confusing or
misleading. The comparison at [https://pdfjs.express/pdfjs-vs-
express](https://pdfjs.express/pdfjs-vs-express) says "PDF.js is an open-
source PDF library that was created by Mozilla in 2011 to let you open and
render PDFs in web browsers using JavaScript. PDF.js Express is a fully-
featured commercial PDF.js viewer with a modern and customizable UI."

I would really like to know whether or not "PDF.js Express" is open source.
Why? Because I've done a lot of work on react + pdf.js already (for a latex
editor), and it's been high on my todo list to add annotation features. So
PDF.js express significantly overlaps with something I'm very seriously
planning to do...

~~~
williamstein
Evidently I should clarify that by "open source", I mean "released under an
OSI approved license"
([https://opensource.org/licenses](https://opensource.org/licenses)). Maybe
robocop2018 means "open source" in the sense of "there is possibly minified
non-human readable source code that you can look at under a very restrictive
non-OSI license"?

~~~
niknikson
Thank you for your feedback and question. My apologies if it’s unclear. The
source code for the UI is available on GitHub [1], but is minified in the
download package for efficiency. Note that even though the code is "open
source" in that repo, we still have a custom license [2]. [1]
[https://github.com/PDFTron/webviewer-
ui](https://github.com/PDFTron/webviewer-ui) [2]
[https://github.com/PDFTron/webviewer-
ui/blob/6.2/LICENSE](https://github.com/PDFTron/webviewer-ui/blob/6.2/LICENSE)

~~~
detaro
So which is it? robocop2018 is claiming it's AGPL/commercial dual-licensed,
but you say it just has the custom license and that's the only license in the
repo?

~~~
robocop2018
We are in the process of updating the site. The product will be licensed under
dual GPL/commercial terms (re: what it means see bit.ly/2JD0Yj0)

------
skratlo
Does not support XFA forms

~~~
niknikson
Yes, that's correct. It's not supported by PDF.js [1]. But the good news is
that it looks like Adobe is finally moving away from their proprietary XFA
format, with the introduction of their forms extension.

[1]
[https://github.com/mozilla/pdf.js/issues/2373](https://github.com/mozilla/pdf.js/issues/2373)

------
andrepd
Am I missing something? Why should I pay 5000 for a pdf viewer, with features
dozens of other pdf viewers have?

~~~
robocop2018
The talk is not about pdf viewers but about framework/APIs that developers can
use to build all those 'others' solutions. pdfjs.express makes this a piece of
cake, you get the source, and companies can outdo competition will less
developer $$$ sunk into reinventing the wheel

------
battery_cowboy
Do you just use the open source PDF.js engine or do you contribute back to the
project with fixes and features?

~~~
robocop2018
It's an extension of pdf.js, not a fork.

~~~
detaro
The parent didn't ask if it was a fork or not.

~~~
bdcravens
The point being that this is an extension, and contributing back to that
dependency is orthogonal.

~~~
detaro
If they contribute back _was the question_.

------
animalnewbie
> modern react UI.

What is an ancient react UI?

~~~
Lev1a
Whatever was popular >1 month(s) ago.

