Konversi PDF untuk membersihkan SVG? [Tutup]

114

Saya mencoba mengonversi PDF ke SVG. Namun, yang saya gunakan saat ini memetakan jalur untuk setiap huruf di setiap bagian teks, yang berarti jika saya mengubah teks di file sumbernya, itu terlihat jelek.

Saya bertanya-tanya apa konverter PDF ke SVG terbersih itu, semoga yang tidak memiliki jalur untuk area teksnya yang tidak membutuhkannya. Seperti yang kita ketahui, PDF dan SVG cukup mirip, jadi saya berasumsi ada beberapa konverter bagus di luar sana.

DanRedux
sumber
11
'Seperti yang kita ketahui, PDF dan SVG cukup mirip ...' ?!?!? Kalau begitu, kamu tahu lebih banyak daripada aku ...
Kurt Pfeifle
22
Keduanya serupa dalam arti bahwa keduanya adalah format berbasis vektor. Di situlah perbandingan berakhir, saya yakin.
Frank Rem
1
Saya kira mereka berdua menggunakan banyak posisi teks absolut.
Bryan Field
Apakah ada yang melakukan ini dengan PDF interaktif (form-field) sehingga mereka tetap interaktif di browser, mungkin menempatkan INPUT di atas SVG yang dirender?
Tim

Jawaban:

84

Inkscape digunakan oleh banyak orang di Wikipedia untuk mengonversi PDF ke SVG.

http://inkscape.org/

Mereka bahkan memiliki panduan praktis tentang cara melakukannya!

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

Saintt Sheldon Patnett
sumber
4
Inkscape tidak berfungsi dengan baik, karena juga mengubah teks menjadi jalur. Saya juga menemukan bahwa mereka sering kehilangan data font, tetapi tampaknya tidak mendekati font yang terpasang dengan baik. Bagaimana PDF menampilkannya jika SVG tidak bisa?
DanRedux
Itu pertanyaan yang wajar, saya paham dengan kedua format tersebut tetapi saya belum melakukan banyak penelitian tentang topik tersebut. Saya mungkin akan memeriksanya. Ini mungkin bermuara pada cara kedua format itu dibangun. SVG misalnya dibangun dengan XML sementara PDF menggunakan format Jenis XML itu sendiri.
Saintt Sheldon Patnett
3
Nah, alasan saya menginginkan ini adalah karena saya ingin bisa mengedit teks menggunakan PHP. Saya dapat melakukannya secara langsung dengan PDF, tetapi PDF tidak dapat dimasukkan dengan mudah ke HTML, tetapi SVG dapat. Saya mungkin tetap menggunakan PDF dan mengubahnya menjadi JPG dalam PHP setelah mengedit nilainya ..
DanRedux
8
@DanRedux: AFAIK, Anda dapat mematikan konversi 'teks font ke jalur' di Inkscape. Pada baris perintah Inkscape Anda akan mengaktifkan konversi ini dengan menambahkan --export-text-to-path.
Kurt Pfeifle
1
Mungkin sudah jelas tetapi Illustrator dapat mengonversi PDF ke SVG. Datang ke sini, mengunduh Inkscape kemudian menyadari bahwa saya memiliki Illustrator. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin
83

Anda dapat menggunakan Inkscape hanya pada baris perintah, tanpa membuka GUI. Coba ini:

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

Untuk daftar lengkap dari semua opsi baris perintah, jalankan inkscape --help.

Kurt Pfeifle
sumber
Ini menghapus spasi dalam teks untuk saya.
MaxNoe
1
@MaxNoe: Itu sangat mungkin - tapi kemudian ini adalah "properti" dari cara bagaimana PDF tersebut dibangun, secara internal. Untuk beberapa penjelasan tentang kesulitan dalam mengenali dan mengekstrak "teks" dari PDF, lihat file PDF kode tangan saya (dengan komentar yang disematkan) di GitHub . (Buka di editor teks pilihan Anda serta penampil PDF dan salin teks tempel dari file.)
Kurt Pfeifle
Ya, saya pikir itu ada hubungannya dengan cara tex merender whitespace, sebagai kotak.
MaxNoe
23

Saat ini saya menggunakan PDFBox yang memiliki dukungan yang baik untuk keluaran grafis. Ada dukungan yang baik untuk mengekstrak goresan vektor dan juga untuk mengatur font. Ada beberapa alat yang bagus untuk mencobanya (misalnya PDFReader akan ditampilkan sebagai Java Graphics2D). Anda dapat mencegat alat grafik dengan alat SVG seperti Batik (Saya melakukan ini dan hasilnya bagus).

Tidak ada cara sederhana untuk mengonversi semua PDF ke SVG - ini tergantung pada strategi dan alat yang digunakan untuk membuat PDF. Beberapa teks diubah menjadi vektor dan tidak dapat direkonstruksi dengan mudah - Anda harus menginstal font vektor dan mencarinya.

UPDATE: Sekarang saya telah mengembangkan ini menjadi paket PDF2SVG yang tidak lagi menggunakan Batik:

yang telah diuji pada berbagai PDF. Ini menghasilkan keluaran SVG yang terdiri dari

  • karakter sebagai satu <svg:text>per karakter
  • jalur sebagai <svg:path>
  • gambar sebagai <svg:image>

Paket selanjutnya akan (mudah-mudahan) mengonversi karakter menjadi teks berjalan dan jalur ke objek grafis tingkat yang lebih tinggi

UPDATE: Sekarang kita dapat membuat ulang running text dari karakter SVG. Kami juga telah mengubah diagram ke XML khusus domain (mis. Spektrum kimia). Lihat https://bitbucket.org/petermr/svg2xml-dev . Ini masih dalam Alpha, tetapi bergerak dengan kecepatan yang berguna. Siapapun dapat bergabung!

MEMPERBARUI. (@Tim Kelty) Kami terus mengerjakan PDF2SVG dan juga alat hilir yang melakukan (terbatas) Java OCR dan pembuatan primitif grafis tingkat tinggi (panah, kotak, dll.) Lihat https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma dan https://bitbucket.org/petermr/ami-core . Ini adalah proyek yang didanai untuk menangkap 100 juta fakta dari literatur ilmiah (contentmine.org) yang sebagian besar adalah PDF.

peter.murray.rust
sumber
19

Topik ini sudah cukup lama, tetapi berikut adalah solusi praktis yang saya temukan:

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

Ini menawarkan alat, pdf2png, yang setelah diinstal melakukan persis pekerjaan di baris perintah. Saya telah mengujinya dengan hasil yang tak tercela sejauh ini, termasuk dengan bitmap.

EDIT: Kesalahan saya, alat ini juga mengubah huruf menjadi jalur, sehingga tidak menjawab pertanyaan awal. Bagaimanapun itu melakukan pekerjaan dengan baik, dan dapat berguna bagi siapa saja yang tidak berniat untuk mengubah kode di file svg, jadi saya akan meninggalkan posting.

pierre
sumber
Di Ubuntu Anda dapat menginstalnya dengan: $ sudo apt-get install pdf2svg
tvw
2
Meskipun mengubah huruf menjadi jalur, hasilnya bagus. Untuk membuat beberapa modifikasi, saya biasa mengedit SVG secara langsung dengan editor. Jika Anda membuka dan menyimpannya dengan inkscape sebagai inkscape SVG, kodenya terlihat lebih baik dan Anda memiliki id objek, untuk menemukan entitas dengan mudah, Anda ingin mengubahnya.
tvw
1
Anda dapat menginstalnya di Mac dengan brew install pdf2svg.
Cola
10

Inilah proses yang akhirnya saya gunakan. Alat utama yang saya gunakan adalah Inkscape yang dapat mengonversi teks dengan baik.

  • menggunakan tindakan Adobe Acrobat Pro dengan JavaScript untuk memisahkan lembar PDF
  • menjalankan Inkscape Portable 0.48.5 dari Windows Cmd untuk mengkonversi ke SVG
  • membuat beberapa pengeditan manual pada atribut SVG XML tertentu yang bermasalah dengan menggunakan Windows Cmd dan Windows PowerShell

Halaman Terpisah: Adobe Acrobat Pro dengan JavaScript

Menggunakan Tindakan Adobe Acrobat Pro (sebelumnya Pemrosesan Batch) membuat tindakan kustom untuk memisahkan halaman PDF menjadi file terpisah. Alternatifnya, Anda mungkin bisa membagi PDF dengan GhostScript

Acrobat JavaScript Action untuk membagi halaman

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

Konversi PDF ke SVG: Inkscape dengan file batch CMD Windows

Menggunakan Windows Cmd membuat file batch untuk mengulang melalui semua file PDF dalam folder dan mengubahnya menjadi SVG

File batch untuk mengonversi PDF ke SVG di folder saat ini

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

Atribut pembersihan: Cmd Windows dan PowerShell

Saya menyadari ini bukan praktik terbaik untuk mengedit secara manual secara manual brute force tag atau atribut SVG atau XML karena variasi potensial dan harus menggunakan pengurai XML sebagai gantinya. Namun saya memiliki masalah sederhana di mana lebar guratan pada satu gambar sangat kecil, dan di gambar lain keluarga font salah diidentifikasi, jadi saya pada dasarnya memodifikasi skrip batch Windows Cmd sebelumnya untuk melakukan pencarian dan penggantian sederhana. Satu-satunya perubahan adalah definisi string pencarian dan perubahan untuk memanggil perintah PowerShell. Perintah PowerShell akan melakukan pencarian dan mengganti serta menyimpan file yang dimodifikasi dengan sufiks tambahan. Saya menemukan beberapa referensi lain yang bisa lebih baik digunakan untuk mengurai atau memodifikasi file SVG yang dihasilkan jika pembersihan kecil lainnya diperlukan.

Modifikasi untuk mencari dan mengganti data XML SVG secara manual

:: 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%'"

Semoga ini bisa membantu seseorang

Referensi

Actions Adobe Acrobat Pro dan referensi JavaScript ke Halaman Terpisah

Referensi GhostScript ke Halaman Terpisah

Referensi Inkscape Command Line untuk Konversi PDF ke SVG

Referensi Windows Cmd Batch File Script

Penelitian penggantian atribut / tag XML

ClearBlueSky85
sumber
7

Jika DVI ke SVG adalah pilihan, Anda juga dapat menggunakan dvisvgm untuk mengonversi file DVI ke file SVG. Ini bekerja dengan sempurna misalnya untuk rumus LaTeX (dengan opsi --no-fonts):

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

Ada juga pdf2svg yang menggunakan poppler dan Kairo untuk mengubah pdf menjadi SVG. Ketika saya mencoba ini, SVG ditampilkan dengan sempurna inkscape.

dhaumann.dll
sumber
1
Saya memiliki PDF yang menampilkan beberapa simbol LaTeX dari paket skak (bidak catur). File khusus ini tidak ditangani dengan baik di Inkscape, karena simbol menjadi huruf Arial ... Saya mendapatkan hasil yang benar dengan pdf2svg.
LRMAAX
Untuk sistem Windows, terdapat seperangkat alat biner terkompilasi di sini: Poppler untuk Windows .
Paolo Gibellini
7

Skrip Bash untuk mengonversi setiap halaman PDF menjadi file SVG-nya sendiri.

#!/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

Untuk menghasilkan dalam png, gunakan --export-png, dll ...

Alain Pannetier
sumber
1

Saya menemukan itu xfigmelakukan pekerjaan yang sangat baik:

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

export to svg

Itu jauh lebih baik daripada inkscape. Sebenarnya mungkin pdtoedit yang melakukannya.

pengguna877329
sumber