自动化

自动化

我有一个包含地图的大型 PDF 文件。该 PDF 文件可能是使用 AutoCAD 生成的。

该图像由彩色栅格地图和地图顶部带有线条的矢量图组成。(街道线等)

我需要分别处理栅格和矢量图。当我将其导入 Photoshop 时,它只能看到一个图层。当我在 Adob​​e PDF Reader 上选择图层选项卡时,它也只显示一个图层。但我确信有多个图层,因为当它渲染文件时,它首先在背景中绘制地图,然后才开始在顶部绘制矢量图。如果我的速度足够快,我实际上可以使用“打印屏幕”来保存背景栅格。我需要一种更可靠的方法来提取该图像以及矢量图。

我可以使用 Ghostscript 之类的开源工具将 PDF 拆分为文本、光栅和矢量数据等基本部分吗?然后将它们全部放在一个文件夹中?

答案1

我找到了一个手动解决方案Inkscape,正在寻找实现自动化的方法。

  1. 在 Inkscape 中打开 PDF(我也有一张和你类似的地图)。使用默认导入设置。
  2. 菜单 > 对象 > 对象。(而不是图层)
  3. 它打开一个对象面板。这就像图层一样。我们可以点击左侧的列来切换可见性、锁定它等。
  4. 那里有一个项目,但有一个箭头表示可能还有更多。我点击它,它展开以显示几个子项目。
  5. 当我单击每个对象时,图像上的不同对象被选中。切换可见性(闭上眼睛)时,每个对象都会从图像中消失。
  6. 因此,在隐藏了所有不想要的东西后,我转到文件 > 导出 PNG 图像。我必须增加尺寸和 DPI 才能获得良好的分辨率。默认设置有一个小缩略图。
  7. 我现在得到了我需要的地图。

自动化

我找到了一种执行此操作的命令行方式。

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 来自哪里

更多参考资料

答案3

我刚刚看到这篇 2019 年 9 月发表的文章:https://north-road.com/2019/09/03/qgis-3-10-loves-geopdf/

显然,如果它是“Geo PDF”,我们可以将其导入 QGIS 并获取所有矢量图层等。然后当然可以在 QGIS 中对图层进行任何操作。可能值得快速尝试。

答案4

您应该使用 autocad 版本或从那里将其导出为单独的图层。一旦将其导出为 PDF,它就会变成位图图像,您无法将其作为单独的图层进行编辑。

相关内容