Как я могу разбить файл 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.
- Open the PDF in Inkscape (I too had a map like yours). Go with the default import settings.
- Menu > Object > Objects. (and not Layers)
- It opens an objects panel. This is just like layers. We can click on the left columns to toggle visibility, lock it, etc.
- 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.
- 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.
- 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.
- 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/programs/ogr2ogr.html — это часть GDAL
- Загрузите его здесь: https://gdal.org/download.html .
- Если вы не можете установить/заставить его работать, используйте докер: см. https://github.com/OSGeo/gdal/tree/master/docker#example .
Дальнейшие ссылки
- 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 он становится растровым изображением, которое нельзя редактировать как отдельные слои.