PDF输出

作者

叶旺沃森阿塞法

联系

位于dmsolutions.ca的Yassefa

最后更新

2006-01-12

介绍

已将PDF输出支持添加到MapServer 3.7中。MapServer的早期版本支持使用实用程序(shp2pdf)输出PDF输出,以便在给定MapServer映射文件的情况下输出PDF文件。

这个新版本的不同之处在于,现在可以使用 IMAGETYPEOUTPUTFORMAT 映射文件中的参数。此外,现在PDF输出支持栅格层。

备注

从6.0版开始,通过cairo支持PDF输出。这并没有反映在当前文档中。

当前支持和不支持的内容

  1. 矢量层

    • 图层点:支持

    • 层线:支持

    • 图层多边形:支持

    • 层圆:不支持

备注

注意:PDFLIB版本6或更高版本支持虚线。

备注

不支持用符号填充的多边形。

  1. 栅格层

    支持栅格图层。请注意,此时,所有栅格层在写入PDF文件之前都转换为jpeg格式。

  2. WMS层

    尚不支持

  3. 环绕组件

    不支持Legend和ScaleBar。

  4. 字体

    支持标准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 中读取的任何其他元素。