Перетворити PDF в чистий SVG? [зачинено]


114

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

Мені було цікаво, що таке найчистіший конвертер PDF у SVG, сподіваємось, той, у якого немає шляху для його текстових областей, які просто не потрібні. Як ми знаємо, PDF та SVG досить схожі, тому я припускаю, що там є якісь хороші перетворювачі.


11
"Як ми знаємо, PDF та SVG досить схожі ..." ?!?!? У цьому випадку ви знаєте набагато більше, ніж я ...
Курт Пфайфл

22
Вони схожі за тим, що вони обидва векторних форматів. Ось на чому я закінчую порівняння.
Френк Рем

1
Я думаю, що вони обидва використовують багато абсолютного позиціонування тексту.
Брайан Філд

Хтось робить це з інтерактивними PDF (формами) 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 Type.
Сент Шелдон Патнетт

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/…
Е. Сундін

83

Ви можете використовувати Inkscape лише в командному рядку, не відкриваючи GUI. Спробуйте це:

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

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


Це видаляє простір у тексті для мене.
MaxNoe

1
@MaxNoe: Це цілком можливо - але тоді це "властивість" способу побудови цього конкретного PDF, всередині. Деякі пояснення труднощів, коли потрібно розпізнати та витягнути "текст" з PDF-файлів, дивіться мої ручні закодовані PDF-файли (із вбудованими коментарями) на GitHub . (Відкрийте їх у текстовому редакторі на ваш вибір, а також у програмі перегляду PDF та скопіюйте текст із файлів.)
Kurt Pfeifle,

Так, я думаю, це пов'язане з тим, як текс передає пробіли, як поля.
MaxNoe

23

Зараз я використовую PDFBox, який має гарну підтримку для графічного виводу. Існує хороша підтримка для вилучення векторних штрихів, а також для управління шрифтами. Існує кілька хороших інструментів для їх випробування (наприклад, PDFReader відображатиметься як Java Graphics2D). Ви можете перехопити графічний інструмент за допомогою інструменту SVG на зразок Batik (я це роблю, і це дає гарне захоплення).

Немає простого способу перетворення всього PDF у SVG - це залежить від стратегії та інструментів, що використовуються для створення PDF-файлів. Деякий текст перетворюється у вектори і його неможливо легко реконструювати - вам потрібно встановити векторні шрифти та переглянути їх.

ОНОВЛЕННЯ: Зараз я розробив це в пакет PDF2SVG, який більше не використовує Batik:

який був протестований на ряді 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.


19

Ця тема досить стара, але ось зручне рішення, яке я знайшов:

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

Він пропонує інструмент pdf2png, який після встановлення виконує саме таку роботу в командному рядку. Я перевіряв це з незаперечними результатами, в тому числі з растровими.

EDIT: Моя помилка, цей інструмент також перетворює листи в шляхи, тому він не стосується початкового питання. Однак це добре справляється і може бути корисним для всіх, хто не має наміру змінювати код у файлі svg, тому я залишу цю посаду.


На Ubuntu ви можете встановити його за допомогою: $ sudo apt-get install pdf2svg
tvw

2
Хоча це перетворює букви в шляхи, результати чудові. Щоб внести деякі зміни, я редагував SVG безпосередньо з редактором. Якщо ви відкриєте і збережете їх за допомогою Inkscape у вигляді SVG Inkscape, код виглядає краще і у вас є ідентифікатори об'єктів, щоб легко знаходити об'єкти, які потрібно змінити.
tvw

1
Ви можете встановити його на Mac за допомогою brew install pdf2svg.
Колас

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 (раніше пакетна обробка), створіть власну дію для розділення сторінок PDF на окремі файли. Або ви можете розділити PDF-файли за допомогою GhostScript

Дія Acrobat для розділення сторінок

/* 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 з пакетним файлом CMD Windows

За допомогою 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


7

Якщо DVI у SVG є опцією, ви також можете використовувати dvisvgm для перетворення DVI-файлу у файл SVG. Це прекрасно працює, наприклад, для формул LaTeX (з опцією --no-fonts):

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

Існує також pdf2svg, який використовує poppler та Cairo для перетворення PDF у SVG. Коли я спробував це, SVG чудово видавався inkscape.


1
У мене є PDF, який відображає деякі символи LaTeX з пакету skak (шахові фігури). Цей конкретний файл недостатньо обробляється в Inkscape, оскільки символи стають Arial літерами ... У мене є правильні результати з pdf2svg.
LRMAAX

Для систем Windows тут набір компільованих двійкових інструментів: Poppler for Windows .
Paolo

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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.