環境:來源於工作過程,使用的API是 arcgis js 3.* 3系API,4.*暫時沒測試;
1、數據與打印服務跨域情況下,不能打印問題。
一般情況下,我們發布的數據服務和打印服務是在一台服務器上,但業務中經常會調用別家單位的服務,要實現打印怎么辦?
解決:通過設置通用代理,arcgis js api提供了基於.NET /JAVA的代理,在proxy.config里面設置好服務的IP即可。
2、打印中文亂碼。
這個情況一般都是服務器的打印模板MXD字體默認是ESRI美國的字體,需要更改為中文編碼格式,比如:宋體,
修改路徑:安裝ArcGIS Server的文件夾,\ArcGIS\Server\Templates\ExportWebMapTemplates\,在下面修改要用到的排版樣式的字體和排版布局。
3、PictureMarkerSymbol等一些自定義樣式,使用自己的圖標無法打印出來。
這里由於打印內部代碼沒有支持自定義圖標,所以一般只能顯示在GraphicsLayer中,但無法打印出來。
解決:使用arcgis中SimpleMarkerSymbol的默認樣式,雖然圖標沒有那么明確,但可以打印。
4、圖例打印出來顯示 override。
一般使用graphicsLayer來顯示,如果不過濾那么,打印的時候一般都是以override1、override2的形式來顯示圖例。
這個問題主要就是因為內部自動使用ColorInfo渲染,可以改變渲染方式來實現。
解決:1) 使用renderer代替setSymbol來渲染顏色;2)還一種方式:設置PrintTemplate的LayoutOptions里面參數LegendLayers為服務圖層,即不顯示GraphicsLayer的圖例。
5、打印服務圖層,圖例均不能顯示,比如一個土地利用規划,N個圖例都不顯示。
一般我們顯示圖層都是自己設置圖層名稱,直接使用Layer.id=圖層名稱 ,來加載設置,不顯示圖層都沒有特別提示,這個問題估計難倒了一大批GIS開發人員,新手熟手都一直沒解決。
終於功夫不誤有心人,在GeoNet、stackexchange網上終於摸到了一些蛛絲馬跡:【LegendLayer.layerId property stands for the assigned ID string of the layer in the map, not in the service.】
意思就是圖例圖層layerId 要顯示的是默認加載到Map中ID(一般是layer1這樣的形式),而不是我們給圖層指定的圖層名稱,這個才是真的關鍵。
解決:對於要加載圖例的動態服務、瓦片服務、要素服務,不指定ID=圖層名稱,默認加載后獲取layer.id,然后賦予給LegendLayer.layerId,即能顯示圖層圖例。
6、圖例對一些服務支持的格式不支持,存在漏洞BUG。
Legend images are unsupported for .emf, .gif, .pdf, .svg, .svgz, and .tif image formats. These formats are supported for classic map services (MXD).