创建包含对开页面的地图册
ArcGIS 提供了创建地图册(打印或 Adobe PDF 格式)所需的所有工具。地图册是统一打印或导出的一组页面。其中许多页面都包含地图,而其他页面可包含文本、表格信息、内容列表或标题页及其他内容。
地图作者可利用对开页面解决地图册的装订线问题。装订线是为了对地图册页面进行装订而需要留出的空白。这通常是包含覆盖连续地图范围的参考系列的地图册,类似于参考地图册。然而,与参考系列不同的是,此地图册使用两个地图文档的布局:一个用于左侧页面,一个用于右侧页面。地图册系列范围使用“数据驱动页面”进行定义。在每个地图文档中创建一组相同的“数据驱动页面”。arcpy.mapping Python 脚本将同时使用这两个地图文档,并将左侧和右侧页面以正确顺序编入 PDF 文档。
以上示例显示了密歇根州阿勒纳克县的地形图册(包含对开页面)。请注意,编号为奇数的地图页面(例如第 3 页)具有布局对齐。这样,所有页面元素都向左侧偏移。编号为偶数的地图页面(例如第 4 页)向右侧对齐。这样便留出了地图册装订的空间。此外,还为每个地图布局定位了页码和定位器地图,以使它们位于页面之外。每种页面对齐方式(左右两侧)都基于一个单独的 ArcMap 文档。可使用“数据驱动页面”和 arcpy.mapping Python 脚本创建此文档。
有关详细信息,请参阅创建数据驱动页面。
此示例基于以下前提假设:
- 拥有两个已启用“数据驱动页面”的现有地图文档,其中一个文档设置为左侧页面,另一文档设置为右侧页面。
此代码示例适用于使用 ArcGIS 构建地图册中呈现的简单参考系列地图册示例。
您可通过执行以下帮助主题中概述的步骤重新创建此地图册:使用“数据驱动页面”创建地图后,需要创建地图文档的副本。生成两个副本后,可重新定向每个文档中的地图元素,使得一个布局定向到左侧,另一个布局定向到右侧。为地图文档命名时,请确保能够根据名称区分出哪个是最终地图册的左侧页面,哪个是右侧页面。由于地图册需要显示页码,因此应确保“数据驱动页面”的起始页码值足够大以便涵盖最终地图册中起始页面前面的所有页。在本例中,地图页的前面有两页。因此,地图页应从第 3 页开始。请确保设置数据驱动页面 对话框中起始页码的值为 3。
- 已具有地图册标题页 PDF 文件。
- 已具有包含总览图页的 PDF 文件。
使用 ArcMap 便可以创建标题页和总览图页。编写每种页面的内容然后将各页面导出为单独的 PDF 即可。
如果已准备好地图文档和 PDF 文件,便可运行以下代码创建最终地图册 PDF。Python 窗口或独立 Python 应用程序中都可以运行此代码。
虽然本主题中的特定代码仅适用于上述示例地图册,但您可以将此处介绍的过程和技巧应用到自己的地图册中。
创建包含对开页面的地图册 PDF。
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
最开始几行代码表示,导入所需模块;创建保存最终地图册 PDF 的输出位置变量;在指定的输出位置文件夹中创建新的空 PDF 文档。该 PDF 即是该脚本的最终输出。
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.
有关详细信息,请参阅 arcpy.mapping 的 PDFDocument 类。
接下来几行代码表示将标题页和总览图页添加到最终 PDF。本示例的前提假设是存在可用作标题页和总览图页的现有 PDF 文档。
接下来的代码表示为地图文档创建布局左对齐的“数据驱动页面”。各奇数页的 PDF 即使用这些“数据驱动页面”创建完成。对右对齐的页面重复以上步骤,即可为偶数页创建 PDF。
有关详细信息,请参阅 arcpy.mapping 的MapDocument 类和 DataDrivenPages 类。
如果使用 Python 窗口运行此代码,应该了解如何为循环输入多条指令。
输入第一行命令后,要想接着输入代码行而不执行代码块,请在第一行命令输入完成后按住 CTRL 键并按 ENTER。光标即会移动到 Python 窗口的二级提示符 (...) 处,此时便可输入其他代码行。按此种方式输入完所有命令后,按两次 ENTER 便可执行整个代码块。
接下来,需要将左侧和右侧页面按照正确的顺序追加到最终 PDF。
最后的代码表示对属性进行更新,然后保存和关闭最终 PDF。