Конвертировать PDF для очистки SVG?

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

Вот процесс, который я использовал. Основным инструментом, который я использовал, был 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 (ранее пакетная обработка) создает настраиваемое действие для разделения 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 script, чтобы выполнить простую поиск и замену. Единственные изменения были в определении строки поиска и изменении вызова команды 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 script ссылки

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

Ответ 7

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 и т.д.

Ответ 8

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

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

export to svg

Это намного лучше, чем inkscape. На самом деле, возможно, это было сделано pdtoedit.

Ответ 10

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

Скрипты: pdf2svg и Imagemagicks convert