Two major bug fixes and a new features:

Bug Fix 1: The problem was with the indirect object cache. When we're looking for an indirect object whose target is a compressed object stream, we look at all of the objects in that stream, decode each one, and then add the object to the indirect object cache.  We decode and cache each object, even though we're only looking for one of the objects in the stream.  (It's possible this was originally an optimization). The problem is that, due to different cross references for different objects, the objects in one of the streams may not necessarily be the newest versions of the object. If we add it to the cache, we may be adding a bad object to the cache.

Bug Fix 2: The key bug that was fixed was in the loop near the "PDF 1.5+ Cross-Reference Stream" comment tag in read(). In the old code, values could be added to self.xref_objStm even though they already exist in self.xref[generation]. That should not happen because they will override the more up-to-date xref values. Instead of fixing this with a few lines of code, I cleaned up that section (which parses the xref dictionaries) and added comments.

Both of the bugs above would occur when using tools on PDFs to add and delete pages. PDF encoders often have optimizations that produce funny xref tables and if they aren't properly handled, you get incorrect results.

New Feature: I added the function mergeRotateAroundPointPage, which adds one page to another while rotating that page around a point.