Конвертировать PDF в чистый SVG? [закрыто]

115

Я пытаюсь преобразовать PDF в SVG. Однако тот, который я использую в настоящее время, отображает путь для каждой буквы в каждом фрагменте текста, что означает, что если я изменю текст в исходном файле, он будет выглядеть некрасиво.

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

DanRedux
источник
12
«Как мы знаем, PDF и SVG довольно похожи ...» ?!?!? В таком случае вы знаете гораздо больше, чем я ...
Курт Пфайфл
22
Они похожи в том смысле, что оба являются векторными форматами. Думаю, на этом сравнение заканчивается.
Фрэнк Рем
1
Я полагаю, что они оба используют много абсолютного позиционирования текста.
Брайан Филд,
Кто-нибудь делает это с интерактивными (с полями формы) PDF-файлами, чтобы они оставались интерактивными в браузере, возможно, накладывая INPUT на визуализированный SVG?
Тим

Ответы:

84

Inkscape используется многими людьми в Википедии для преобразования PDF в SVG.

http://inkscape.org/

У них даже есть удобное руководство, как это сделать!

http://en.wikipedia.org/wiki/Wikipedia:Graphic_Lab/Resources/PDF_conversion_to_SVG#Conversion_with_Inkscape

Сент-Шелдон Патнетт
источник
4
Inkscape работает не очень хорошо, так как тоже меняет текст на контуры. Я также обнаружил, что они часто теряют данные шрифта, но, похоже, не соответствуют хорошему установленному шрифту. Как PDF отображает это, если SVG не может?
DanRedux
Это справедливый вопрос, я знаком с обоими форматами, но я не проводил большого исследования по этой теме. Я могу взглянуть на это. Думаю, это может сводиться к тому, как построены эти два формата. Например, SVG построен с использованием XML, в то время как PDF использует собственный формат типа XML.
Saint Sheldon Patnett
3
Я хочу этого, потому что хочу иметь возможность редактировать текст с помощью PHP. Я мог бы сделать это напрямую с PDF, но PDF не может быть легко встроен в HTML, а SVG может. Я могу просто придерживаться PDF и конвертировать его в JPG на PHP после редактирования значений ..
DanRedux
8
@DanRedux: AFAIK, вы можете отключить преобразование текстов шрифтов в пути в Inkscape. В командной строке Inkscape вы можете включить это преобразование, добавив --export-text-to-path.
Курт Пфайфл
1
Это может быть очевидно, но Illustrator может конвертировать PDF в SVG. Пришел сюда, скачал Inkscape, потом понял, что у меня есть Illustrator. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
Э. Сундин
84

Вы можете использовать Inkscape только в командной строке, не открывая графический интерфейс. Попробуй это:

inkscape \
  --without-gui \
  --file=input.pdf \
  --export-plain-svg=output.svg 

Чтобы получить полный список всех параметров командной строки, запустите inkscape --help.

Курт Пфайфле
источник
Это убирает для меня место в тексте.
MaxNoe
1
@MaxNoe: Это вполне возможно, но тогда это «свойство» того, как этот конкретный PDF-файл создается внутри. Некоторые объяснения трудностей, возникающих при распознавании и извлечении «текста» из PDF-файлов, можно найти в моих вручную закодированных PDF-файлах (со встроенными комментариями) на GitHub . (Откройте их в любом текстовом редакторе по вашему выбору, а также в программе просмотра PDF-файлов и скопируйте и вставьте текст из файлов.)
Курт Пфайфл
Да, я думаю, это связано с тем, как текс отображает пробелы в виде блоков.
MaxNoe
23

В настоящее время я использую PDFBox, который хорошо поддерживает графический вывод. Есть хорошая поддержка для извлечения векторных штрихов, а также для управления шрифтами. Есть несколько хороших инструментов для опробования (например, PDFReader будет отображаться как Java Graphics2D). Вы можете перехватить графический инструмент с помощью инструмента SVG, такого как Batik (я делаю это, и он дает хороший захват).

Нет простого способа преобразовать весь PDF в SVG - это зависит от стратегии и инструментов, используемых для создания PDF-файлов. Некоторый текст преобразуется в векторные и не может быть легко восстановлен - вам нужно установить векторные шрифты и искать их.

ОБНОВЛЕНИЕ: теперь я разработал это в пакет PDF2SVG, который больше не использует батик:

который был протестирован на ряде PDF-файлов. Он производит вывод SVG, состоящий из

  • символы по одному <svg:text>на персонажа
  • пути как <svg:path>
  • изображения как <svg:image>

Более поздние пакеты (надеюсь) преобразуют символы в бегущий текст и пути к графическим объектам более высокого уровня.

ОБНОВЛЕНИЕ: теперь мы можем воссоздать текущий текст из символов SVG. Мы также преобразовали диаграммы в XML для конкретных областей (например, химические спектры). См. Https://bitbucket.org/petermr/svg2xml-dev . Он все еще в альфа-версии, но движется с полезной скоростью. Присоединиться может любой желающий!

ОБНОВИТЬ. (@Tim Kelty) Мы продолжаем работать над PDF2SVG, а также над последующими инструментами, которые выполняют (ограниченное) Java OCR и создают графические примитивы более высокого уровня (стрелки, прямоугольники и т. Д.) См. Https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma и https://bitbucket.org/petermr/ami-core . Это финансируемый проект по сбору 100 миллионов фактов из научной литературы (contentmine.org), большая часть которой - PDF.

peter.murray.rust
источник
19

Эта тема довольно старая, но вот удобное решение, которое я нашел:

http://www.cityinthesky.co.uk/opensource/pdf2svg/

Он предлагает инструмент pdf2png, который после установки выполняет ту же работу, что и в командной строке. Пока что я тестировал его с безупречными результатами, в том числе с растровыми изображениями.

РЕДАКТИРОВАТЬ: Моя ошибка, этот инструмент также преобразует буквы в пути, поэтому он не решает исходный вопрос. Тем не менее, он в любом случае хорошо справляется со своей задачей и может быть полезен всем, кто не намерен изменять код в файле svg, поэтому я оставлю сообщение.

пьер
источник
В Ubuntu вы можете установить его с помощью: $ sudo apt-get install pdf2svg
tvw
2
Хотя он преобразует буквы в пути, результаты отличные. Чтобы внести некоторые изменения, я редактировал SVG напрямую с помощью редактора. Если вы откроете и сохраните их с помощью inkscape как inkscape SVG, код будет выглядеть лучше, и у вас есть идентификаторы объектов, чтобы легко находить объекты, которые вы хотите изменить.
tvw 02
1
Вы можете установить его на Mac с помощью brew install pdf2svg.
Colas
10

Вот процесс, который я в итоге использовал. Основным инструментом, который я использовал, был Inkscape, который мог нормально конвертировать текст.

  • использовали действия Adobe Acrobat Pro с JavaScript для разделения листов PDF
  • запустил Inkscape Portable 0.48.5 из Windows Cmd для преобразования в SVG
  • вручную отредактировал конкретный атрибут SVG XML, с которым у меня возникли проблемы, с помощью Windows Cmd и Windows PowerShell.

Отдельные страницы: Adobe Acrobat Pro с JavaScript

Используя Adobe Acrobat Pro Actions (ранее называвшуюся пакетной обработкой), можно создать настраиваемое действие для разделения страниц PDF на отдельные файлы. В качестве альтернативы вы можете разделить PDF-файлы с помощью GhostScript.

Действие Acrobat JavaScript для разделения страниц

/* Extract Pages to Folder */

var re = /.*\/|\.pdf$/ig;
var filename = this.path.replace(re,"");

{
    for ( var i = 0;  i < this.numPages; i++ )
    this.extractPages
     ({
        nStart: i,
        nEnd: i,
        cPath : filename + "_s" + ("000000" + (i+1)).slice (-3) + ".pdf"
    });
};

Преобразование PDF в SVG: Inkscape с пакетным файлом Windows CMD

С помощью Windows Cmd был создан командный файл, чтобы просмотреть все файлы PDF в папке и преобразовать их в SVG.

Пакетный файл для преобразования PDF в SVG в текущей папке

:: ===== SETUP =====
@echo off
CLS
echo Starting SVG conversion...
echo.

:: setup working directory (if different)
REM set "_work_dir=%~dp0"
set "_work_dir=%CD%"

:: setup counter
set "count=1"

:: setup file search and save string
set "_work_x1=pdf"
set "_work_x2=svg"
set "_work_file_str=*.%_work_x1%"

:: setup inkscape commands
set "_inkscape_path=D:\InkscapePortable\App\Inkscape\"
set "_inkscape_cmd=%_inkscape_path%inkscape.exe"

:: ===== FIND FILES IN WORKING DIRECTORY =====
:: Output from DIR last element is single  carriage return character. 
:: Carriage return characters are directly removed after percent expansion, 
:: but not with delayed expansion.

pushd "%_work_dir%"
FOR /f "tokens=*" %%A IN ('DIR /A:-D /O:N /B %_work_file_str%') DO (
    CALL :subroutine "%%A"
)
popd

:: ===== CONVERT PDF TO SVG WITH INKSCAPE =====

:subroutine
echo.
IF NOT [%1]==[] (

    echo %count%:%1
    set /A count+=1

    start "" /D "%_work_dir%" /W "%_inkscape_cmd%" --without-gui --file="%~n1.%_work_x1%" --export-dpi=300 --export-plain-svg="%~n1.%_work_x2%"

) ELSE (
    echo End of output
)
echo.

GOTO :eof

:: ===== INKSCAPE REFERENCE =====

:: print inkscape help
REM "%_inkscape_cmd%" --help > "%~dp0\inkscape_help.txt"
REM "%_inkscape_cmd%" --verb-list > "%~dp0\inkscape_verb_list.txt"

Атрибуты очистки: Windows Cmd и PowerShell.

Я понимаю, что вручную редактировать теги или атрибуты SVG или XML грубой силой не рекомендуется из-за возможных изменений и вместо этого следует использовать синтаксический анализатор XML. Однако у меня была простая проблема, когда ширина штриха на одном чертеже была очень маленькой, а на другом семейство шрифтов определялось неправильно, поэтому я в основном модифицировал предыдущий пакетный сценарий Windows Cmd, чтобы выполнить простой поиск и замену. Единственные изменения коснулись определений строки поиска и изменения для вызова команды PowerShell. Команда PowerShell выполнит поиск и замену и сохранит измененный файл с добавленным суффиксом. Я нашел некоторые другие ссылки, которые можно было бы лучше использовать для анализа или изменения результирующих файлов SVG, если требуется выполнить какую-то другую незначительную очистку.

Модификации для ручного поиска и замены данных SVG XML

:: setup file search and save string
set "_work_x1=svg"
set "_work_x2=svg"
set "_work_s2=_mod"
set "_work_file_str=*.%_work_x1%"

powershell -Command "(Get-Content '%~n1.%_work_x1%') | ForEach-Object {$_ -replace 'stroke-width:0.06', 'stroke-width:1'} | ForEach-Object {$_ -replace 'font-family:Times Roman','font-family:Times New Roman'} | Set-Content '%~n1%_work_s2%.%_work_x2%'"

Надеюсь, это может кому-то помочь

Ссылки

Действия Adobe Acrobat Pro и ссылки JavaScript на отдельные страницы

Ссылки GhostScript на отдельные страницы

Ссылки на командную строку Inkscape для преобразования PDF в SVG

Ссылки на скрипт командного файла Windows Cmd

Исследование замены тегов / атрибутов XML

ClearBlueSky85
источник
7

Если DVI в SVG является вариантом, вы также можете использовать dvisvgm для преобразования файла DVI в файл SVG. Это отлично работает, например, для формул LaTeX (с опцией --no-fonts):

dvisvgm --no-fonts input.dvi -o output.svg

Существует также pdf2svg, который использует poppler и Cairo для преобразования pdf в SVG. Когда я попробовал это, SVG был отлично отрисован inkscape.

dhaumann
источник
1
У меня есть PDF-файл, который отображает некоторые символы LaTeX из пакета skak (шахматные фигуры). Этот конкретный файл плохо обрабатывается в Inkscape, поскольку символы превращаются в буквы Arial ... Я получил правильные результаты с pdf2svg.
LRMAAX
Для систем Windows здесь есть набор скомпилированных бинарных инструментов: Poppler для Windows .
Паоло Гибеллини
7

Сценарий Bash для преобразования каждой страницы PDF в отдельный файл SVG.

#!/bin/bash
#
#  Make one PDF per page using PDF toolkit.
#  Convert this PDF to SVG using inkscape
#

inputPdf=$1

pageCnt=$(pdftk $inputPdf dump_data | grep NumberOfPages | cut -d " " -f 2)

for i in $(seq 1 $pageCnt); do
    echo "converting page $i..."
    pdftk ${inputPdf} cat $i output ${inputPdf%%.*}_${i}.pdf
    inkscape --without-gui "--file=${inputPdf%%.*}_${i}.pdf" "--export-plain-svg=${inputPdf%%.*}_${i}.svg"
done

Чтобы сгенерировать в png, используйте --export-pngи т.д ...

Ален Паннетье
источник
1

Я обнаружил, что xfigпроделал отличную работу:

pstoedit -f fig foo.pdf foo.fig
xfig foo.fig

export to svg

Он работал намного лучше, чем inkscape. На самом деле, вероятно, это сделал pdtoedit.

user877329
источник