Konwertować PDF do czystego SVG? [Zamknięte]

115

Próbuję przekonwertować plik PDF na SVG. Jednak ten, którego używam, obecnie mapuje ścieżkę dla każdej litery w każdym fragmencie tekstu, co oznacza, że ​​jeśli zmienię tekst w pliku źródłowym, wygląda brzydko.

Zastanawiałem się, jaki jest najczystszy konwerter plików PDF na SVG, mam nadzieję, że nie ma ścieżki do obszarów tekstowych, które po prostu jej nie potrzebują. Jak wiemy, PDF i SVG są dość podobne, więc zakładam, że istnieje kilka dobrych konwerterów.

DanRedux
źródło
12
„Jak wiemy, PDF i SVG są dość podobne…” ?!?!? W takim razie wiesz o wiele więcej niż ja ...
Kurt Pfeifle
22
Są podobne w tym sensie, że oba są formatami wektorowymi. Myślę, że na tym kończy się porównanie.
Frank Rem
1
Przypuszczam, że obaj używają dużo bezwzględnego pozycjonowania tekstu.
Bryan Field
Czy ktoś robi to z interaktywnymi plikami PDF (z polami formularza), aby pozostały interaktywne w przeglądarce, być może nakładając INPUT na renderowany SVG?
Tim

Odpowiedzi:

84

Inkscape jest używany przez wiele osób w Wikipedii do konwersji plików PDF na SVG.

http://inkscape.org/

Mają nawet przydatny przewodnik, jak to zrobić!

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

Saintt Sheldon Patnett
źródło
4
Inkscape nie działa zbyt dobrze, ponieważ zmienia tekst również na ścieżki. Uważam również, że często tracą dane czcionki, ale nie wydają się przybliżać dobrej, zainstalowanej czcionki. Jak wyświetla go PDF, jeśli SVG nie może?
DanRedux,
To uczciwe pytanie, znam oba formaty, ale nie przeprowadziłem zbyt wielu badań w tym temacie. Mogę się temu przyjrzeć. Uważa, że ​​może to sprowadzać się do sposobu, w jaki te dwa formaty są zbudowane. Na przykład SVG jest zbudowany z XML, podczas gdy PDF używa własnego formatu XML.
Saintt Sheldon Patnett
3
Cóż, chcę tego, ponieważ chcę mieć możliwość edycji tekstu za pomocą PHP. Mógłbym to zrobić bezpośrednio z PDF, ale PDF nie może być łatwo wstawiony do HTML, ale SVG tak. Mogę tylko trzymać z PDF i przekształcić go do JPG w PHP po edycji To wartości ..
DanRedux
8
@DanRedux: AFAIK, możesz wyłączyć konwersję „tekstów czcionek na ścieżki” w Inkscape. W wierszu poleceń Inkscape można włączyć tę konwersję, dodając --export-text-to-path.
Kurt Pfeifle
1
Może to być oczywiste, ale Illustrator może konwertować pliki PDF do SVG. Przyjechałem tutaj, pobrałem Inkscape, a potem zdałem sobie sprawę, że mam Illustrator. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin
84

Możesz używać Inkscape tylko w wierszu poleceń, bez otwierania GUI. Spróbuj tego:

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

Aby uzyskać pełną listę wszystkich opcji wiersza poleceń, uruchom inkscape --help.

Kurt Pfeifle
źródło
To usuwa dla mnie miejsce w tekście.
MaxNoe
1
@MaxNoe: To całkiem możliwe - ale jest to „właściwość” sposobu, w jaki ten konkretny plik PDF jest zbudowany wewnętrznie. Aby zapoznać się z niektórymi wyjaśnieniami trudności związanych z rozpoznawaniem i wyodrębnianiem „tekstu” z plików PDF, zobacz moje ręcznie kodowane pliki PDF (z osadzonymi komentarzami) w witrynie GitHub . (Otwórz je w wybranym edytorze tekstu, a także w przeglądarce PDF i skopiuj i wklej tekst z plików.)
Kurt Pfeifle
Tak, myślę, że ma to związek ze sposobem, w jaki tex renderuje białe spacje jako pudełka.
MaxNoe
23

Obecnie używam PDFBox, który ma dobre wsparcie dla wyjścia graficznego. Istnieje dobre wsparcie dla wyodrębniania obrysów wektorowych, a także zarządzania czcionkami. Istnieje kilka dobrych narzędzi do wypróbowania tego (np. PDFReader wyświetli się jako Java Graphics2D). Możesz przechwycić narzędzie graficzne za pomocą narzędzia SVG, takiego jak Batik (robię to i daje dobre przechwytywanie).

Nie ma prostego sposobu na konwersję wszystkich plików PDF do SVG - zależy to od strategii i narzędzi użytych do tworzenia plików PDF. Część tekstu jest konwertowana na wektory i nie można jej łatwo zrekonstruować - musisz zainstalować czcionki wektorowe i sprawdzić je.

AKTUALIZACJA: Teraz opracowałem to w pakiecie PDF2SVG, który nie używa już Batika :

który został przetestowany na wielu plikach PDF. Tworzy plik wyjściowy SVG składający się z plików

  • znaków jako jeden <svg:text>na znak
  • ścieżki jak <svg:path>
  • obrazy jako <svg:image>

Późniejsze pakiety (miejmy nadzieję) przekonwertują znaki na tekst i ścieżki do obiektów graficznych wyższego poziomu

AKTUALIZACJA: Możemy teraz odtworzyć działający tekst ze znaków SVG. Przekonwertowaliśmy również diagramy do formatu XML specyficznego dla domeny (np. Widma chemiczne). Zobacz https://bitbucket.org/petermr/svg2xml-dev . Nadal jest w fazie alfa, ale porusza się z użyteczną prędkością. Każdy może się przyłączyć!

AKTUALIZACJA. (@Tim Kelty) Nadal pracujemy nad PDF2SVG, a także nad narzędziami, które wykonują (w ograniczonym zakresie) Java OCR i tworzenie prymitywów graficznych wyższego poziomu (strzałki, ramki itp.) Zobacz https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma i https://bitbucket.org/petermr/ami-core . Jest to finansowany projekt mający na celu uchwycenie 100 milionów faktów z literatury naukowej (contentmine.org), z których większość to PDF.

peter.murray.rust
źródło
19

Ten temat jest dość stary, ale oto przydatne rozwiązanie, które znalazłem:

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

Oferuje narzędzie pdf2png, które po zainstalowaniu wykonuje dokładnie to samo co w wierszu poleceń. Do tej pory przetestowałem to z nienagannymi wynikami, w tym z bitmapami.

EDYCJA: Mój błąd, to narzędzie również konwertuje litery na ścieżki, więc nie odpowiada na początkowe pytanie. Jednak i tak robi dobrą robotę i może być przydatny dla każdego, kto nie zamierza modyfikować kodu w pliku svg, więc zostawię post.

pierre
źródło
Na Ubuntu możesz go zainstalować za pomocą: $ sudo apt-get install pdf2svg
tvw
2
Chociaż konwertuje litery na ścieżki, wyniki są świetne. Aby dokonać pewnych modyfikacji, zwykłem edytować pliki SVG bezpośrednio w edytorze. Jeśli otworzysz je i zapiszesz w inkscape jako inkscape SVG, kod wygląda lepiej i masz identyfikatory obiektów, aby łatwo znaleźć encje, które chcesz zmienić.
tvw
1
Możesz go zainstalować na komputerze Mac z rozszerzeniem brew install pdf2svg.
Colas
10

Oto proces, którego użyłem. Głównym narzędziem, którego użyłem, był Inkscape, który był w stanie poprawnie konwertować tekst.

  • wykorzystał akcje Adobe Acrobat Pro z JavaScriptem, aby podzielić arkusze PDF
  • uruchomił Inkscape Portable 0.48.5 z Windows Cmd, aby przekonwertować go do SVG
  • dokonałem ręcznych edycji określonego atrybutu XML SVG, z którym miałem problemy, używając Windows Cmd i Windows PowerShell

Oddzielne strony: Adobe Acrobat Pro z JavaScriptem

Korzystając z Adobe Acrobat Pro Actions (dawniej Batch Processing) utwórz niestandardową akcję, aby podzielić strony PDF na osobne pliki. Alternatywnie możesz podzielić pliki PDF za pomocą GhostScript

Akcja Acrobat JavaScript do dzielenia stron

/* 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"
    });
};

Konwersja PDF do SVG: Inkscape z plikiem wsadowym Windows CMD

Za pomocą programu Windows Cmd utworzono plik wsadowy, aby przeglądać wszystkie pliki PDF w folderze i konwertować je do formatu SVG

Plik wsadowy do konwersji pliku PDF na SVG w bieżącym folderze

:: ===== 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"

Atrybuty czyszczenia: Windows Cmd i PowerShell

Zdaję sobie sprawę, że nie jest najlepszą praktyką ręczną edycję znaczników lub atrybutów SVG lub XML na siłę ze względu na potencjalne różnice i zamiast tego należy użyć parsera XML. Jednak miałem prosty problem, w którym szerokość obrysu na jednym rysunku była bardzo mała, a na innym rodzina czcionek była nieprawidłowo identyfikowana, więc zasadniczo zmodyfikowałem poprzedni skrypt wsadowy Windows Cmd, aby wykonać proste wyszukiwanie i zamianę. Jedyne zmiany dotyczyły definicji ciągu wyszukiwania i zmiany w celu wywołania polecenia programu PowerShell. Polecenie PowerShell wykona wyszukiwanie i zamienianie oraz zapisuje zmodyfikowany plik z dodanym sufiksem. Znalazłem kilka innych odniesień, które można lepiej wykorzystać do przeanalizowania lub zmodyfikowania wynikowych plików SVG, jeśli konieczne jest wykonanie innego drobnego czyszczenia.

Modyfikacje umożliwiające ręczne wyszukiwanie i zamianę danych 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%'"

Mam nadzieję, że to może komuś pomóc

Bibliografia

Akcje Adobe Acrobat Pro i odwołania JavaScript do oddzielnych stron

GhostScript odwołuje się do oddzielnych stron

Odniesienia do wiersza poleceń Inkscape dotyczące konwersji plików PDF na SVG

Odwołania do skryptów plików wsadowych Windows Cmd

Badanie zastępowania tagów / atrybutów XML

ClearBlueSky85
źródło
7

Jeśli opcją jest DVI na SVG, możesz również użyć programu dvisvgm do konwersji pliku DVI na plik SVG. Działa to doskonale na przykład dla formuł LaTeX (z opcją --no-fonts):

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

Istnieje również pdf2svg, który używa popplera i Cairo do konwersji pliku PDF na SVG. Kiedy próbowałem tego, plik SVG był doskonale wyrenderowany w formacie inkscape.

dhaumann
źródło
1
Mam plik PDF, który renderuje niektóre symbole LaTeX z pakietu skak (figury szachowe). Ten konkretny plik nie jest dobrze obsługiwany w Inkscape, ponieważ symbole stają się literami Arial ... Otrzymałem poprawne wyniki z pdf2svg.
LRMAAX
Dla systemów Windows jest tutaj zestaw skompilowanych narzędzi binarnych: Poppler dla Windows .
Paolo Gibellini
7

Skrypt Bash do konwersji każdej strony pliku PDF do własnego pliku 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

Aby wygenerować w png, użyj --export-pngitp ...

Alain Pannetier
źródło
1

Okazało się, że xfigwykonał świetną robotę:

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

export to svg

Wykonał znacznie lepszą pracę niż inkscape. Właściwie to prawdopodobnie zrobił to pdtoedit.

user877329
źródło