Creating a map book with facing pages

ArcGIS provides all the tools you need to create map books in printed or Adobe PDF format. A map book is a collection of pages printed or exported together. Many of the pages contain maps, but other pages may be dedicated to text, tabular information, tables of contents, or title pages, and other content.

Facing pages allow the map author to account for the book gutter. The gutter is the space required to allow for binding book pages together. Often, this is a map book that contains a reference series covering a succession of map extents, just as a reference map book does. However, unlike a reference series, this map book utilizes the layouts of two map documents: one for the left page and one for the right. The series extents are defined using Data Driven Pages. Create the same set of Data Driven Pages in each map document. The arcpy.mapping Python script uses both map documents and assembles the left and right pages into the final PDF document in the proper order.

Simple reference series map book example

The example above shows a topographic map book for Arenac County, Michigan, with facing pages. Notice that the odd-numbered map pages (for example, page 3) have a layout alignment such that all page elements are shifted to the left. Even-numbered map pages (for example, page 4) are aligned to the right. This is to allow space for the book binding. Also, page numbers and the locator map have been located for each map layout so that they are on the outside of the page. Each page alignment (both left and right) is based on a separate ArcMap document. You can create this document using Data Driven Pages and an arcpy.mapping Python script.

For more information, see Creating Data Driven Pages.

This example has the following assumptions:

TipTip:

You can create title and overview map pages using ArcMap. Just author the content for each page and export each to a separate PDF.

Once you have a map document and PDF files ready, you can run the code below to create your final map book PDF. You can run the code in the Python window or in a stand-alone Python application.

Though the specific code in this topic applies to the example map book above, you can also apply the procedures and tips presented here to your own map books.

Create a map book PDF with facing pages.

import arcpy, os

# Create an output directory variable
#
outDir = r"C:\temp\MBExample\final_output"  

# Create a new, empty pdf document in the specified output directory
#
finalpdf_filename = outDir + r"\FinalMB.pdf"
if os.path.exists(finalpdf_filename):
  os.remove(finalpdf_filename)
finalPdf = arcpy.mapping.PDFDocumentCreate(finalpdf_filename)

# Add the title page to the pdf
#
finalPdf.appendPages(r"C:\temp\MBExample\ancillary_pages\TitlePage.pdf")

# Add the index map to the pdf
#
finalPdf.appendPages(r"C:\temp\MBExample\maps\IndexMap.pdf")

# Create Facing Pages for the map book
# Create pages for left-hand side of the book
#
mxdPathLeft = r"C:\temp\MBExample\maps\Arenac County MB Left.mxd"
tempMapLeft = arcpy.mapping.MapDocument(mxdPathLeft)
tempDDPLeft = tempMapLeft.dataDrivenPages

# Loop creates individual pdf's for odd numbered pages
#
for pgNumLeft in range(1, tempDDPLeft.pageCount + 1, 2):
  temp_filename = r"C:\temp\MBExample\temp_pdfs\MB_" + \
                            str(pgNumLeft) + ".pdf"
  if os.path.exists(temp_filename):
    os.remove(temp_filename)
  tempDDPLeft.exportToPDF(temp_filename, "RANGE", pgNumLeft)

# Create pages for right-hand side of the book
#
mxdPathRight = r"C:\temp\MBExample\maps\Arenac County MB Right.mxd"
tempMapRight = arcpy.mapping.MapDocument(mxdPathRight)
tempDDPRight = tempMapRight.dataDrivenPages

# Loop creates individual pdf's for even numbered pages
#
for pgNumRight in range(2, tempDDPRight.pageCount + 1, 2):
  temp_filename = r"C:\temp\MBExample\temp_pdfs\MB_" + \
                             str(pgNumRight) + ".pdf"
  if os.path.exists(temp_filename):
    os.remove(temp_filename)
  tempDDPRight.exportToPDF(temp_filename, "RANGE", pgNumRight)

# Append right and left-hand pages together in proper order
#
for pgNum in range(1, tempDDPLeft.pageCount + 1):
  print "Page", pgNum, "of", tempDDPLeft.pageCount
  tempPDF = r"C:\temp\MBExample\temp_pdfs\MB_" + str(pgNum) + ".pdf"
  finalPdf.appendPages(tempPDF)

# Update the properties of the final pdf
#
finalPdf.updateDocProperties(pdf_open_view="USE_THUMBS",
                             pdf_layout="SINGLE_PAGE")

# Save your result
#
finalPdf.saveAndClose()

# Delete variables
#
del finalPdf, mxdPathLeft, mxdPathRight, tempDDPLeft, tempDDPRight, 
tempMapLeft, tempMapRight, tempPDF

The first lines of code import the necessary modules; create an output location variable where the final map book PDF will be saved; and create a new, empty PDF document in the specified output location folder. This PDF is the final output for this script.

TipTip:

Programming languages, such as Python, treat a backslash (\) as an escape character. For instance, \n represents a line feed, and \t represents a tab. When specifying a path, a forward slash (/) can be used in place of a backslash. Two backslashes can be used instead of one to avoid a syntax error. A string literal can also be used by placing the letter r before a string containing a backslash so it is interpreted correctly.

For more information, see the PDFDocument class of arcpy.mapping.

The next lines of code add the title page and the overview map page to the final PDF. This example assumes that you have existing PDF documents that can be used for title and overview map pages.

Next, the code creates Data Driven Pages for the map document with the layout aligned to the left. PDFs are created using these Data Driven Pages for each odd-numbered page. This is then repeated for the pages aligned to the right where PDFs are created for the even-numbered pages.

For more information, see the MapDocument class and the DataDrivenPages class of arcpy.mapping.

If you are using the Python window to run this code, you should know how to enter multiple commands for the loop.

To enter lines after the first line without executing the code block, after entering the first line, hold down the CTRL key and press ENTER. The cursor moves to a secondary prompt (...) in the Python window, and an additional line of code can be entered. When finished entering all commands in this manner, press ENTER twice to execute the entire code block.

Next, the left-hand and right-hand pages need to be appended to the final PDF in the proper order.

Finally, the code updates the properties, then saves and closes the final PDF.

Related Topics

2/12/2013