我有一个包含地图的大型 PDF 文件。该 PDF 文件可能是使用 AutoCAD 生成的。
该图像由彩色栅格地图和地图顶部带有线条的矢量图组成。(街道线等)
我需要分别处理栅格和矢量图。当我将其导入 Photoshop 时,它只能看到一个图层。当我在 Adobe PDF Reader 上选择图层选项卡时,它也只显示一个图层。但我确信有多个图层,因为当它渲染文件时,它首先在背景中绘制地图,然后才开始在顶部绘制矢量图。如果我的速度足够快,我实际上可以使用“打印屏幕”来保存背景栅格。我需要一种更可靠的方法来提取该图像以及矢量图。
我可以使用 Ghostscript 之类的开源工具将 PDF 拆分为文本、光栅和矢量数据等基本部分吗?然后将它们全部放在一个文件夹中?
答案1
我找到了一个手动解决方案Inkscape,正在寻找实现自动化的方法。
- 在 Inkscape 中打开 PDF(我也有一张和你类似的地图)。使用默认导入设置。
- 菜单 > 对象 > 对象。(而不是图层)
- 它打开一个对象面板。这就像图层一样。我们可以点击左侧的列来切换可见性、锁定它等。
- 那里有一个项目,但有一个箭头表示可能还有更多。我点击它,它展开以显示几个子项目。
- 当我单击每个对象时,图像上的不同对象被选中。切换可见性(闭上眼睛)时,每个对象都会从图像中消失。
- 因此,在隐藏了所有不想要的东西后,我转到文件 > 导出 PNG 图像。我必须增加尺寸和 DPI 才能获得良好的分辨率。默认设置有一个小缩略图。
- 我现在得到了我需要的地图。
自动化
我找到了一种执行此操作的命令行方式。
inkscape -z -i g2846 -j -D -d 300 test3.pdf -e 3.png
参考文档:https://inkscape.org/sk/doc/inkscape-man.html
解释参数:
-z
:无 GUI,仅在命令行中运行 Inkscape-i g2846
:选择要导出的特定组/图层 ID。我通过 Inkscape gui 中上述手动步骤了解了这个 ID/标签。-j
:隐藏导出中的所有其他图层等-D
:保持导出图像的尺寸与整个绘图/文档相同,并保持提取对象的位置。(如果原始对象旋转/扭曲,并且您希望输出不是原始对象,或者如果您正在提取多个图层并需要在画布上保持它们的位置,这一点很重要)-d 300
:300 DPI:默认值使输出 png 损耗太大,此设置使我这边一切保持良好。test3.pdf
:我的输入pdf-e 3.png
:导出为PNG,并指定文件名。
不幸的是,目前我们一次只能提取一个对象/图层。有一个针对 Inkscape 请求允许多个图层的错误:允许多个 -i (--export-id=ID) 选项。
[编辑] 如果您想要多个(但不是全部)图层,则另一种解决方法是:使用inkscape
上面共享的命令将各个图层取出为:1.png, 2.png, 3.png
然后,从运行以下命令图像魔法:
$ convert -page +0+0 1.png \
-page +0+0 2.png \
-page +0+0 3.png \
-layers merge +repage merged.png
这样就应该将各层合并在一起merged.png
。
答案2
发布另一个使用 ogr2ogr 工具的可能解决方案。这是一个 repo,它非常有效,可以帮助从“Geo PDF”中删除多个图层:https://github.com/draftmpd41/layers_draft_delhi_master_plan_2041
命令行 ogr2ogr
请参阅.bat 文件,这里是其中的示例命令:
ogr2ogr -f "GEOJSON" Boundaries_DDA_ZONE_Boundary_polyline.geojson draftplan.pdf Layers_Boundries_DDA_ZONE_Boundary_polyline -s_srs EPSG:32643 -t_srs EPSG:4326 --config OGR_PDF_READ_NON_STRUCTURED YES
解释:
-f "GEOJSON"
:以这种格式输出Boundaries_DDA_ZONE_Boundary_polyline.geojson
:输出文件名draftplan.pdf
:输入pdf文件名Layers_Boundries_DDA_ZONE_Boundary_polyline
:PDF 内的图层名称:您可以通过在某处打开 pdf 并检查图层面板等来获取此信息。-s_srs EPSG:32643
: 来源 CRS 或基准或 srs - 很多术语,我不会说!如果你一开始不知道,就直接说EPSG:4326
t_srs EPSG:4326
:目标 CRS(或基准面或 srs)。如果您需要经纬度,则需要 EPSG:4326。--config OGR_PDF_READ_NON_STRUCTURED YES
:输入这个后它就可以工作了。我不知道详细信息。
寻找 CRS
最初我们不知道源CRS是什么,所以通过这种方法找到:
- 将其转换为仅 EPSG:4326,并获取一个纬度经度为超高数字的文件
- 将其加载到 QGIS。找到并按下工具栏中的“缩放至图层”按钮。我们可以看到形状,但相对于 openstreetmap 背景 XYZ 图层而言,它不协调。没有问题。
- 找到形状中您知道其真实世界位置的一个点。
- 注意此点的 X、Y 坐标(大数字)(注意:X 是经度,Y 是纬度,因此您会看到经纬度,而不是纬经度)
- 现在,打开http://projfinder.com/并将地图移动到现实世界的位置
- 粘贴您记下的 X 和 Y 值,然后按“查找...”按钮
- 此站点现在会找出您图层的所有潜在 CRS 系统。选择最合适的系统,记下代码
EPSG:____
并将其插入到命令行中-s_srs EPSG:____
- 现在重新运行命令并在 QGIS 或其他工具中加载输出 geojsonhttps://geojson.io希望它是正确的
免责声明
这特定于“地理”PDF,其中图层是地图上的某个东西。我不确定这种方法对矢量图形的效果如何。但您仍然可以将输出加载到 QGIS 上,然后按缩放到形状,应该能够看到形状 - 然后您可以将其导出为图像/屏幕截图并继续工作。
ogr2ogr 来自哪里
- https://gdal.org/programs/ogr2ogr.html- 它是 GDAL 的一部分
- 点击此处下载:https://gdal.org/download.html
- 如果你无法安装/使其工作,请使用docker:参见https://github.com/OSGeo/gdal/tree/master/docker#example
更多参考资料
- https://gdal.org/drivers/vector/pdf.html说这里也有针对地理空间 PDF 的直接功能,但是...没有示例命令 :(
答案3
我刚刚看到这篇 2019 年 9 月发表的文章:https://north-road.com/2019/09/03/qgis-3-10-loves-geopdf/
显然,如果它是“Geo PDF”,我们可以将其导入 QGIS 并获取所有矢量图层等。然后当然可以在 QGIS 中对图层进行任何操作。可能值得快速尝试。
答案4
您应该使用 autocad 版本或从那里将其导出为单独的图层。一旦将其导出为 PDF,它就会变成位图图像,您无法将其作为单独的图层进行编辑。