ExportingToPDF Python for Map Series

2317
7
05-30-2019 07:21 AM
Kara_Shindle
Occasional Contributor III

I am attempting to export a range of sheets in a map series in ArcPro.  I'm basing my code off ESRI's code sample 2 here https://pro.arcgis.com/en/pro-app/arcpy/mapping/mapseries-class.htm.

import arcpy, os, sys
relpath = r"S:\Tax Services\Tax Maps"

aprx = arcpy.mp.ArcGISProject(r"S:\FC GIS\GIS Projects\New Tax Maps\Tax Map DDP\Tax Map DDP - new.aprx")
l = p.listLayouts()[1]
if not l.mapSeries is None:
  ms = l.mapSeries
  if ms.enabled:
    for pageNum in range(1, 5):
      ms.currentPageNumber = pageNum
      print("Exporting {0}".format(ms.pageRow.Page))
      pageName = ms.pageRow.Page
      l.exportToPDF(relpath + "MapSheet_{0}".format(ms.pageRow.page) + ".pdf")‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

However, I keep getting the following error:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-2671737b67ee> in <module>()
      9         for pageNum in range(1, 5):
     10           ms.currentPageNumber = pageNum
---> 11           print("Exporting {0}".format(ms.pageRow.Page))
     12           pageName = ms.pageRow.Page
     13           l.exportToPDF(relpath + "MapSheet_{0}".format(ms.pageRow.Page) + ".pdf")

C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\_mp.py in pageRow(self)
   2240     @property
   2241     def pageRow(self):
-> 2242       return self.convert(convertArcObjectToPythonObject(getattr(self._arc_object, "pageRow")))
   2243 
   2244 

C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\_mp.py in convert(self, dictionary)
   2236     def convert(self, dictionary):
   2237       from collections import namedtuple
-> 2238       return namedtuple('pageRow', dictionary.keys())(**dictionary)
   2239 
   2240     @property

C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\collections\__init__.py in namedtuple(typename, field_names, verbose, rename, module)
    399         if not name.isidentifier():
    400             raise ValueError('Type names and field names must be valid '
--> 401                              'identifiers: %r' % name)
    402         if _iskeyword(name):
    403             raise ValueError('Type names and field names cannot be a '

ValueError: Type names and field names must be valid identifiers: 'Shape.STArea()'‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

Any help would be appreciated!

0 Kudos
7 Replies
JeffBarrette
Esri Regular Contributor

Hello,

I started to reply to this via: https://community.esri.com/message/855395-re-exporttopng-python-for-mapseries

I don't know how to reproduce this error.  Are you specifying a field to define page numbers?  If so, is it numerically defined?  If you set this parameter to None, does your code work?

You are also welcome to send me a project package to jbarrette@esri.com

Jeff (arcpy.mp team)

0 Kudos
Kara_Shindle
Occasional Contributor III

I have the field set to None, that is how I was able to fix the problem I was having similar to Elizabeth's post.  I will put together a map package. thanks.

0 Kudos
JeffBarrette
Esri Regular Contributor

Great.  A project package is better, it will contain all the map series settings.  You can probably get rid of most data, leave the index layer, and save to a temporary aprx before packaging.  This is to avoid a huge file size.

Jeff 

0 Kudos
EarlMedina
Esri Regular Contributor

Hi there GIS Coordinator,

I am going to guess that you are working with a Line/Polygon Feature Class stored in an Enterprise Geodatabase? I spoke earlier with Jeff about another customer's issues with a SQL Server Polygon Feature Class - it looks like the problem here is due to some reserved field names appearing in a dictionary used by exportToPDF. Please go ahead and contact Esri Support Services about being added to the defect log for the issue so you can closely track the status of a fix: "BUG-000123108: exportToPDF fails with "ValueError: Type names and field names must be valid identifiers: 'st_area()/'st_length()'" for SDE polygon and line feature classes."

Unfortunately, there's not a clean way to fix this in your script as the problem lies in the arcpy library itself. However, you can work around the issue by:

  1. Using a File Geodatabase Feature Class instead.
  2. If using a File Geodatabase is completely out of the question, another option would be to:
    • Create center points from the SDE Line/Polygon Feature Class using a tool like https://pro.arcgis.com/en/pro-app/tool-reference/data-management/feature-to-point.htm, storing the output in the same Enterprise Geodatabase as a point feature class
    • Base the Map Series on the SDE point feature class instead (you can bury the Point FC behind other layers/make it completely transparent/etc. and remove it from Legend). The effect here will be that it'll look like the Map Series is based on the original Line/Polygon feature class.

Hope this helps!

-Earl

JeffBarrette
Esri Regular Contributor

I really want to thank Earl from Esri Support for being persistent and chasing this down!  I did not reproduce because I tested with the project package sent to me - that was a fGDB.  Earl submitted a bug and I committed it to our development queue. I prioritized this for 2.5.  (it is too late for 2.4).

Jeff

Kara_Shindle
Occasional Contributor III

Thank you for all of your work helping me on this.  I greatly appreciate it.

0 Kudos
Kara_Shindle
Occasional Contributor III

Thank you for the suggestions.  I will look into adapting my script!  

0 Kudos