Как я могу разбить файл PDF на слои

У меня есть большой файл PDF, содержащий карту. PDF-файл, вероятно, был создан с помощью AutoCAD.

Изображение состоит из цветной растровой карты и вектора с линиями в верхней части карты. (Уличные линии и т. Д.)

Мне нужно работать с растром и вектором отдельно. Когда я импортирую его в фотошоп, он видит только один слой. Когда я выбираю вкладку слоев в Adobe PDF Reader, она также показывает только один слой. Но я уверен, что есть несколько слоев, потому что когда он рендерит файл, он сначала рисует карту в фоновом режиме, и только после того, как начинает рисовать вектор сверху. Если я достаточно быстр, я могу использовать "экран печати", чтобы сохранить фоновый растр. Мне нужен более надежный метод для извлечения этого изображения, а также вектора.

Могу ли я использовать какой-нибудь инструмент с открытым исходным кодом, такой как ghostscript, для разделения pdf на его основные части, такие как текст, растр, векторные данные? И они все их положили в папку?

4 ответа

I've found one manual solution using Inkscape, am looking around for ways to automate it.

  1. Open the PDF in Inkscape (I too had a map like yours). Go with the default import settings.
  2. Menu > Object > Objects. (and not Layers)
  3. It opens an objects panel. This is just like layers. We can click on the left columns to toggle visibility, lock it, etc.
  4. There's one item there, but it has an arrow indicating there might be more. I click that, and it expands to show several sub-items.
  5. As I click on each one, on the image the different objects get selected. On toggling visibility (closing the eye), each object disappears from the image.
  6. Thus after hiding all the stuff I didn't want, I go to File > Export PNG image. I had to increase the size and DPI to get it to a good resolution.. the default setting have a small thumbnail.
  7. I now have the map I needed.

I'm reading up Inkscape's documentation, will update here if I find a way to automate this process. [EDIT] Found a command line way of doing this.

inkscape -z -i g2846 -j -D -d 300 test3.pdf -e 3.png

Справочный документ: https://inkscape.org/sk/doc/inkscape-man.html

Объясняя параметры:

  • -z: нет графического интерфейса, запустите inkscape только в командной строке
  • -i g2846: Выбор определенной группы / идентификатора слоя для экспорта. Я узнал этот идентификатор / метку по вышеупомянутым ручным шагам в интерфейсе Inkscape.
  • -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Затем выполните следующую команду из imagemagick:

$ convert -page +0+0 1.png \
-page +0+0 2.png \
-page +0+0 3.png \
-layers merge +repage merged.png

Это должно объединить слои в merged.png,

публикация другого возможного решения с использованием инструмента ogr2ogr. Вот репозиторий, в котором он работал как чудо, помогая вырвать несколько слоев из «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, или datum, или srs — терминов много, и я их не придумываю! Изначально, если вы не знаете, просто укажитеEPSG:4326
  • t_srs EPSG:4326: CRS пункта назначения (или датум, или srs). Вам нужен EPSG:4326, если вам нужна широта-долгота.
  • --config OGR_PDF_READ_NON_STRUCTURED YES: работает, когда это вставлено. Подробности ИДК.

Поиск CRS

Изначально мы не знали, что такое исходный CRS, поэтому выяснили этим методом:

  • преобразуйте его, думая, что это только EPSG:4326, и получите файл с очень большими числами широты и долготы.
  • Загрузите его в QGIS. Найдите и нажмите кнопку «Приблизить к слою» на панели инструментов. Мы можем видеть форму, но она не в порядке по сравнению, скажем, с фоновым слоем XYZ openstreetmap. Без вопросов.
  • Найдите одну точку на фигуре, реальное местоположение которой вам известно.
  • Обратите внимание на координаты X,Y этой точки (большие числа) (примечание: X — это долгота, а Y — широта, поэтому вы увидите долготу-широту, а не широту-долготу)
  • Теперь откройте http://projfinder.com/ и переместите карту в это реальное место.
  • вставьте записанные вами значения X и Y и нажмите кнопку «Найти»..
  • Теперь этот сайт определяет все потенциальные системы CRS вашего уровня. Выберите наиболее подходящий вариант, запишитеEPSG:____код и подключите его к командной строке по адресу-s_srs EPSG:____
  • Теперь повторно запустите команду и загрузите выходной geojson в QGIS или другой инструмент, например https://geojson.io , и, надеюсь, все будет правильно.

Отказ от ответственности

Это характерно для PDF-файлов «Geo», где ваш слой представляет собой что-то на карте. Я не уверен, как этот метод может сработать для векторной графики... но все же вы можете просто загрузить выходные данные в QGIS и нажать кнопку масштабирования, чтобы сформировать фигуру, и вы сможете увидеть фигуру, которую затем можно экспортировать как изображение/скриншот и получить занимаемся делами.

Откуда взялся ogr2ogr

Дальнейшие ссылки

  • https://gdal.org/drivers/vector/pdf.html говорит, что здесь есть прямая вещь и для геопространственных PDF-файлов, но... нет примера команды :(

Я только что наткнулся на эту статью, опубликованную в сентябре 2019 года: https://north-road.com/2019/09/03/qgis-3-10-loves-geopdf/

Очевидно, что если это «Geo PDF», мы можем импортировать его в QGIS и получить все векторные слои и т. д. И, конечно же, в QGIS со слоями можно делать что угодно. Возможно, стоит быстро попробовать.

Вы должны работать с версией AutoCAD или оттуда экспортировать ее в виде отдельных слоев. После экспорта в PDF он становится растровым изображением, которое нельзя редактировать как отдельные слои.

Другие вопросы по тегам