There have been several revisions of the PDF file specification, each backward compatible but adding new features. For example, version 1.6 added a new way to squash down data and reduce the size of PDF files. The current latest version is 1.8 and while it may work in libraries which do not support 1.8, there is no guarantee. Sun’s Java PDF Renderer does not support many of the features in versions 1.6 and above which is why it fails on lots of PDF files.
In order to be confident of displaying the PDF file correctly, you obviously need a program which supports that version. With Acrobat it is always one number than the release (so Acrobat 9 supports all versions up to 1.8 while Acrobat 8 only covers up to 1.7). You can see the version number in Acrobat by opening the preferences window and looking at PDF version. This PDF file is version 1.3 so it needs at least Acrobat 4.0
Most PDF tools have a window to display such information – here is the equivalent in JPedal
You can also find the version by opening the PDF file in a text editor. Most of the content will look like garbage (and you must not resave the file because you can corrupt it), but the first line always contains the version.
This is very useful if you are writing a program which needs to know the version – you just need to read the first line of the file.
The version is also worth considering when creating PDF files. Many creation tools let you target a certain version. Do you need all the bells and whistles present in version 1.8? Does the PDF look identical if you use version 1.4?
Is there a feature in you consider critical in later versions? What do you think?
This post is part of our “Understanding the PDF File Format” series. In each article, we discuss a PDF feature, bug, gotcha or tip. If you wish to learn more about PDF, we have 13 years worth of PDF knowledge and tips, so click here to visit our series index!
IDRsolutions develop a Java PDF library, a PDF forms to HTML5 converter, a PDF to HTML5 or SVG converter and a Java Image Library that doubles as an ImageIO replacement. On the blog our team post about anything interesting they learn about.