pymkup – Opening up Bluebeam Revu PDFs

The construction industry is always lagging behind others in technology. 

That’s not to say that it isn’t there, but there’s a) many people who are old school and won’t change b) too many custom solutions to systemic problems. The largest issue I’ve been able to identify is the amount of data that can’t flow from one system to the next, and requires people to redo their work at most stages. There is not an open data format at all; I really question how most things get built successfully because of lack of coordination and communication.

Estimating software is the worst right now. I took some time to see what was on the market, and if you’re a subcontractor in anything other than MEPF trying to make a bid, good luck. Most of the softwares tell you, “we’re faster than using paper,“ and that is really the base standard that they have for any kind of development.

The top contenders who deal in the 2D estimating space did not have a text search for PDFs when I saw their software demoed. Apple Preview, which opens PDFs on the Mac for free, has had it for at least 20 years, so there’s really no excuse in my mind. Most softwares don’t have automatic sheet labeling, so you have to hire an intern to type those out for you. They don’t care if you can’t navigate documents; instead, if marketing material is any indication, most of these developers are really proud of how they can render a polygon on a page. What they do right are databases of costs and tools that you can use on prints to generate a budget/proposal. If you’re trying to search any kind of text, which is a basic tenant of estimating, you’re screwed.

That’s where Bluebeam Revu comes in. It is a PDF application. It thinks that it wants to be a construction platform, but don’t be fooled. It is only a PDF application.

What it can do well are: page labels/navigation, lineal measurements, rendering, text labels, tool formatting, searching, markup lists, PDF manipulation, and spatial recognition of objects. Pretty much all of the UI things needed to do a proper 2D takeoff.

What Revu is lacking is any sort of cost database to round things out. Instead, they point you to a quantity link tool for Excel that hasn’t been updated in years, very minimal in-tool calculations, their closed API, or manually exporting CSV files. On forums, Revu users have suggested that calculations just aren’t in their wheelhouse.

They seem to want to be one of the big platforms, like Procore or Plangrid, but nothing that they have built in this regard is ready for prime time. Even with lack of true estimating support, however, Bluebeam Revu still comes out on top for functionality for many estimating departments.

I recently asked myself, “how could I make the data generated from Revu just work better?” If there was a way to at least interact with markups in code without jumping through hoops, that would be a step in the right direction.

That is where pymkup comes in, an open API for Bluebeam Revu PDFs written in Python. I have always been an amateur programmer, writing scripts that people seem to like. This is perhaps the most important piece of code that I’ve ever attempted due to its broader impact in the construction industry. It took me a straight month of commits to get it to a release that is generally stable. 

You can scrape out the markups list and spaces list into JSON that can be used in just about any programming language, but the base of it is written in Python.

Am I trying to compete with Bluebeam Revu? No. However, Revu itself uses many open source libraries, and the PDF format itself is also open source. So, to me, this is fair game. If used correctly, this code could bridge many gaps, which is what is needed versus continuing to lock down platforms.

Some example use cases of pymkup that I can think of include:

  • Calculating lengths between points in polylines without having to split the lines in Revu.
  • Calculating the angles between points in polylines so that you can calculate specific materials.
  • Calculating cut optimizations and material quantities required.
  • Porting data to estimating software automatically as you save the document.
  • Preparing a Procore locations tree based on document spaces.
  • Run percentages for completion tracking based on markup status through a separate application.

I hope this is of some use to someone out there. If it is, I am looking for some help to do more testing and squash some bugs, so please submit a pull request. I believe that pymkup will be an important in-between for companies that have not made the leap to 3D estimating, and it extends the functionality of Revu for everyone.


  1. I’m a construction estimator and an amateur python programmer. I’m very interested in your pymkup module. I’ll take a deep look into it. Thanks.

  2. Hi there, I’m trying to run the example code but I get an error when I run x.markups()

    It fails at elif markup[‘IT’] == “PolygonCount”:


    obj = super(DictBasedObject, self).__getitem__(item)

    Error output is KeyError: ‘IT’

    Can you provide any help? Would love to use pymkup!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.