Ответ 1
Inkscape используется многими людьми в Википедии для преобразования PDF в SVG.
У них даже есть удобный справочник о том, как это сделать!
Я пытаюсь преобразовать PDF в SVG. Тем не менее, тот, который я использую, в настоящее время отображает путь для каждой буквы в каждом фрагменте текста, то есть, если я изменяю текст в исходном файле, он выглядит уродливым.
Мне было интересно, что самый чистый PDF-конвертер SVG, надеюсь, тот, у которого нет пути для его текстовых областей, которые просто не нужны. Как мы знаем, PDF и SVG довольно похожи, поэтому я предполагаю, что там есть хорошие конвертеры.
Inkscape используется многими людьми в Википедии для преобразования PDF в SVG.
У них даже есть удобный справочник о том, как это сделать!
Вы можете использовать Inkscape только в командной строке, не открывая графический интерфейс. Попробуйте следующее:
inkscape \
--without-gui \
--file=input.pdf \
--export-plain-svg=output.svg
Для получения полного списка всех параметров командной строки запустите inkscape --help
.
В настоящее время я использую PDFBox, который имеет хорошую поддержку графического вывода. Существует хорошая поддержка для извлечения векторных штрихов, а также для управления шрифтами. Есть несколько полезных инструментов для его проверки (например, PDFReader будет отображаться как Java Graphics2D). Вы можете перехватить графический инструмент с помощью инструмента SVG, такого как Batik (я делаю это, и это дает хороший захват).
Нет простого способа конвертировать весь PDF в SVG - это зависит от стратегии и инструментов, используемых для создания PDF файлов. Некоторый текст преобразуется в векторы и не может быть легко реконструирован - вам нужно установить векторные шрифты и посмотреть их.
UPDATE: Я разработал это в пакете PDF2SVG, который больше не использует Batik:
который был протестирован в ряде PDF файлов. Он производит вывод SVG, состоящий из
<svg:text>
на символ<svg:path>
<svg:image>
Более поздние пакеты (надеюсь) преобразуют символы в рабочий текст и пути к графическим объектам более высокого уровня
UPDATE: Теперь мы можем повторно создать исполняемый текст из символов SVG. Мы также преобразуем диаграммы в специфичные для домена XML (например, химические спектры). См. https://bitbucket.org/petermr/svg2xml-dev. Он все еще в Альфе, но движется с полезной скоростью. Любой может присоединиться!
UPDATE. (@Tim Kelty) Мы продолжаем работу над PDF2SVG, а также инструментами downstream, которые делают (ограниченное) OCR 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.
Эта тема довольно старая, но вот удобное решение, которое я нашел:
http://www.cityinthesky.co.uk/opensource/pdf2svg/
Он предлагает инструмент pdf2png, который после установки выполняет точно задание в командной строке. Я тестировал его с безупречными результатами до сих пор, в том числе с растровыми изображениями.
EDIT: моя ошибка, этот инструмент также преобразует буквы в пути, поэтому он не затрагивает начальный вопрос. Тем не менее, он все равно хорошо работает и может быть полезен для всех, кто не намерен изменять код в svg файле, поэтому я оставлю сообщение.
Если DVI для SVG является опцией, вы также можете использовать dvisvgm для преобразования файла DVI в файл SVG. Это отлично работает, например, для формул LaTeX (с опцией --no-fonts
):
dvisvgm --no-fonts input.dvi -o output.svg
Существует также pdf2svg, который использует poppler и Cairo для преобразования PDF в SVG. Когда я это пробовал, SVG отлично отображался в inkscape
.
Вот процесс, который я использовал. Основным инструментом, который я использовал, был Inkscape, который смог легко конвертировать текст.
Использование действий Adobe Acrobat Pro (ранее пакетная обработка) создает настраиваемое действие для разделения PDF-страниц на отдельные файлы. Кроме того, вы можете разделить PDF файлы с GhostScript
/* 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"
});
};
С помощью Windows Cmd создан пакетный файл для циклического перемещения всех файлов 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"
Я понимаю, что не рекомендуется вручную перебирать силу SVG или XML-тегов или атрибутов из-за возможных изменений, и вместо этого следует использовать синтаксический анализатор XML. Однако у меня была простая проблема, когда ширина штриха на одном чертеже была очень маленькой, а с другой, семейство шрифтов было неправильно идентифицировано, поэтому я в основном изменил предыдущую версию Windows Cmd script, чтобы выполнить простую поиск и замену. Единственные изменения были в определении строки поиска и изменении вызова команды PowerShell. Команда PowerShell выполняет поиск, заменяет и сохраняет измененный файл с добавленным суффиксом. Я нашел некоторые другие ссылки, которые могут быть лучше использованы для синтаксического анализа или изменения результирующих SVG файлов, если необходимо выполнить некоторую другую небольшую очистку.
:: 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%'"
Надеюсь, что это может помочь кому-то
Bash script для преобразования каждой страницы 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
и т.д.
Я обнаружил, что xfig
проделал отличную работу:
pstoedit -f fig foo.pdf foo.fig
xfig foo.fig
export to svg
Это намного лучше, чем inkscape. На самом деле, возможно, это было сделано pdtoedit.
Вы можете использовать http://image.online-convert.com/convert-to-svg. Он хорошо работал в моем опыте.
Вот пример NodeJS REST api для двух сценариев рендеринга PDF. https://github.com/pumppi/pdf2images
Скрипты: pdf2svg и Imagemagicks convert