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

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

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

9 ответов


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

http://inkscape.org/

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

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


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

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

для получения полного списка всех параметров командной строки запустите inkscape --help.


В настоящее время я использую 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.


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

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

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

EDIT: моя ошибка, этот инструмент также преобразует Буквы в пути, поэтому он не решает первоначальный вопрос. Однако это делает хорошую работу в любом случае, и может быть полезен всем, кто не намерен изменять код в svg-файле, поэтому я оставлю сообщение.


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

  • используются действия Adobe Acrobat Pro с JavaScript для разделения PDF-листов
  • ran 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 data

:: 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 tag / attribute replacement research


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

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

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


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

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

inputPdf=

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, etc...


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

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

export to svg

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


вот api REST NodeJS для двух сценариев рендеринга PDF. https://github.com/pumppi/pdf2images

Скрипты: pdf2svg и Imagemagicks конвертировать