PDF输出¶
- 作者
叶旺沃森阿塞法
- 联系
位于dmsolutions.ca的Yassefa
- 最后更新
2006-01-12
介绍¶
已将PDF输出支持添加到MapServer 3.7中。MapServer的早期版本支持使用实用程序(shp2pdf)输出PDF输出,以便在给定MapServer映射文件的情况下输出PDF文件。
这个新版本的不同之处在于,现在可以使用 IMAGETYPE 或 OUTPUTFORMAT 映射文件中的参数。此外,现在PDF输出支持栅格层。
备注
从6.0版开始,通过cairo支持PDF输出。这并没有反映在当前文档中。
当前支持和不支持的内容¶
矢量层
图层点:支持
层线:支持
图层多边形:支持
层圆:不支持
备注
注意:PDFLIB版本6或更高版本支持虚线。
备注
不支持用符号填充的多边形。
栅格层
支持栅格图层。请注意,此时,所有栅格层在写入PDF文件之前都转换为jpeg格式。
WMS层
尚不支持
环绕组件
不支持Legend和ScaleBar。
字体
支持标准PostScript字体。有关其他字体(如TrueType)的使用,请参阅pdflib文档以了解UPR描述文件的使用(其中的一些注释是 here )
实现PDF输出¶
请注意,以下说明是为MapServer 3.7和PDflib 4.0.3开发的,但对于这两个版本的最新版本,一般步骤应该类似。
构建PDF库¶
为了能够访问MapServer中的PDF支持,您应该从http://www.pdflib.com/products/pdflib/下载并构建PDF库。请按照pdflib站点上的说明在特定平台上构建。
以下是有关如何在Windows上构建的一些简短说明:
从https://www.pdflib.com/products/pdflib-family/pdflib下载并提取源代码/
在Visual C++中打开PDFLIB DSW项目
构建项目pdflib_dll
成功生成后,在pdflib目录下应该有pdflib.lib和pdblib.dll
复制系统目录下的pdflib.dll(例如:c:/winnt/system32)
构建支持PDF的MapServer时将使用pdflib.lib
使用PDF支持构建MapServer¶
Windows平台
编辑makefile.vc并取消对以下行的注释(确保路径适合您的安装):
PDF_LIB=../pdflib-4.0.3/pdflib/pdflib.lib
PDF_INC=-I../pdflib-4.0.3/pdflib
PDF=-DUSE_PDF
见 Windows Compilation 通用MapServer编译说明文档。
Unix平台
添加 with-pdf 在编译之前配置命令行。
见 Unix Compilation 通用MapServer编译说明文档。
映射文件定义¶
中的ImageType参数 Mapfile 应设置为PDF以便输出为PDF:
NAME pdf-test
STATUS ON
...
IMAGETYPE pdf
..
WEB
...
END
LAYER
...
END
END
还可以使用 OUTPUTFORMAT 标记(此标记是在MapServer 3.7中引入的):
OUTPUTFORMAT
NAME pdf
MIMETYPE "application/x-pdf"
DRIVER pdf
FORMATOPTION "OUTPUT_TYPE=RASTER" ##not mandatory
END
如果输出_type=栅格,则所有图层都将呈现为栅格。请注意,当 Mapfile 中包含WMS图层时,应设置此选项,因为透明度和WMS图层存在问题。见 OUTPUTFORMAT 对象中 Mapfile 参数说明参考。
测试¶
测试PDF输出映射文件的最简单方法是使用MapServer shp2img utility . Windows用户可以在 MS4W 以及 FWTools .
只需将mapfile传递给可执行文件和输出pdf的名称,就可以生成pdf文件:
shp2img -m gmap_pdf.map -o test.pdf
可能的错误¶
PDFlib I/O error: Resource configuration file 'pdflib.upr' not found
这与字体有关。如果从映射文件中删除标签对象,则会看到此错误消失。描述了PDF错误 here . 基本上,在“修复”此问题之前,如果要在PDF输出中使用非包含的标准PostScript字体(如TrueType字体),请参阅PDFLib文档。
php/mapscript和pdf输出¶
MapServer可以直接渲染为PDF格式,另一个选项是渲染为PNG并将其插入到PDF文档中。当然,这不是创建PDF文档的唯一方法。你需要支持 PDFLib 编译到您的php安装中。
这个例子展示了这个过程的关键部分,您需要自己提供脚本的部分(取决于您的应用程序),并为您想要包含的每个映射元素重复这个过程。
参考 PHP/MapScript Reference 必要时。
它是如何工作的?¶
简而言之,我们将传递将映射呈现到PHP脚本所需的参数,该脚本将:
创建PDF文档
以适当较高的分辨率呈现PNG视图
插入PNG
缓冲并发送给用户
创建PDF文档¶
下面是一个类似于 PHP website 要创建新的PDF文档:
$my_pdf = pdf_new();
...
在尝试插入mapserver元素之前,请完成此阶段和第4.5节的工作。
以适当的分辨率呈现PNG视图¶
从假设你的页面不需要超过300 dpi就可以让你的地图看起来像样。对于A4地图,我使用150 dpi作为8'x 8'主地图,即1200 x 1200像素。
$map->set(width,1200);
$map->set(height,1200);
当然,我们的地图不会非常有用,除非它放大到我们的用户要求的范围,并且他们选择的图层被打开。在应用程序中维护记录以下内容的数组:
- The current extent (say $ext[])
- Layer status (say $layer[])
打开映射文件并将其传递回,以将映射文件设置为用户期望的状态,例如:
$map->setextent($ext[0], $ext[1], $ext[2], $ext[3]);
while($layer[]) {
$layer=$map->getLayer($n);
if($layer[$n]==1) {
$layer->set(status,1);
} else {
$layer->set(status,0);
}
}
现在,您需要将渲染视图保存到PNG文件中。
$img = $map->draw();
$url = $img->saveWebImage(MS_PNG, 0, 0, 0);
对所有地图元素使用相同的方法,如drawreferencemap?(),DrawscaleBar?()和DrawLegend()。
将png元素插入PDF文档¶
这非常简单,使用pdf_open_image_file()函数将地图元素导入PDF文档:
$element = pdf_open_image_file($my_pdf, "png", "$webroot/$url");
pdf_place_image($my_pdf, $element, $xpos, $ypos);
pdf_close_image($my_pdf, $element);
根据需要对创建的任何地图元素重复此操作。
缓冲PDF并将其发送给用户¶
假设我们已经创建了文档$my_pdf,当我们完成后,我们只需要缓冲它并使用echo()将其发送给用户:
<?php
....
pdf_close($my_pdf);
$data = pdf_get_buffer($my_pdf);
header('Content-type: application/pdf');
header('Content-disposition: inline; filename=my_pdf.pdf');
header('Content-length: ' . strlen($data) );
echo $data;
?>
明白:记住,如果在任何阶段都向浏览器输出了文本,就不能发送邮件头。
其他要尝试的内容¶
将所有内容呈现为PNG可能看起来很难看,因此我单步执行键并提取标签,以便使用PDF的文本函数呈现它们。
这可以用于其他地图元素,如地图标题、图层描述或从 Mapfile 中读取的任何其他元素。