Verify PDFA online

PDF/A online verification service

Here's a public service blog-post. Our API can easily verify a PDF against a number of profiles, including all the current variations of PDF/A and PDF/UA. Here we've turned that into an online service: drag a PDF file onto the box, and optionally select which profiles you would like to verify the file against. If the PDF claims to match one or more particular profiles, we'll test those automatically.

File size is limited to 2MB, we've rate-limited the service to one run every 2 seconds, and and only one copy of the verifier will run at once: so if you happen to upload at exactly the same time as another user you'll be asked to try again.

And finally, the files you upload are not stored on our server, and not inspected for anything other than the profiling described here.

Drag your PDF file here
Max size 2MB

The response will show a list of Features that are either incorrectly set or incorrectly missing from the PDF, and would need to be fixed before the PDF is considered to be valid as far as the tested profile is concerned. Roll your mouse over the feature name for more detail.

The method implementing the guts of this service looks (roughly) like this:

      private void validate(String filename, InputStream in, Collection<OutputProfile> targets, Appendable out) throws IOException {
          PDF pdf = new PDF(new PDFReader(in));
          in.close();
          OutputProfiler profiler = new OutputProfiler(new PDFParser(pdf));
          OutputProfile profile = profiler.getProfile();

          targets.addAll(profile.getClaimedTargetProfiles());
          int j = 0;
          for (OutputProfile target : targets) {
              OutputProfile.Feature[] mismatch = profile.isCompatibleWith(target);
              json.put("profile["+j+"].name", target.getProfileName());
              if (mismatch == null) {
                  json.put("profile["+j+"].ok", true);
              } else {
                  json.put("profile["+j+"].ok", false);
                  for (int i=0;i<mismatch.length;i++) {
                      json.put("profile["+j+"].mismatch["+i+"].name", mismatch[i].getFieldName());
                      json.put("profile["+j+"].mismatch["+i+"].desc", mismatch[i].getDescription());
                      json.put("profile["+j+"].mismatch["+i+"].set", profile.isSet(mismatch[i]));
                  }
              }
              j++;
          }
          json.write(out, null);
      }