PDF, SVG'yi temizlemek için dönüştürülsün mü? [kapalı]


115

Bir PDF'yi SVG'ye dönüştürmeye çalışıyorum. Bununla birlikte, şu anda kullandığım metin, her metin parçasındaki her harf için bir yol eşliyor, yani kaynak dosyasındaki metni değiştirirsem çirkin görünüyor.

En temiz PDF'den SVG'ye dönüştürücünün ne olduğunu merak ediyordum, umarım metin alanları için basitçe ihtiyaç duymayan bir yolu yoktur. Bildiğimiz gibi, PDF ve SVG oldukça benzer, bu yüzden orada bazı iyi dönüştürücüler olduğunu varsayıyorum.


12
'Bildiğimiz gibi, PDF ve SVG oldukça benzer ...' ?!?!? Bu durumda, benden çok daha fazlasını biliyorsun ...
Kurt Pfeifle

22
Her ikisinin de vektör tabanlı formatlar olması bakımından benzerler. Sanırım karşılaştırma burada bitiyor.
Frank Rem

1
Sanırım ikisi de çok fazla mutlak metin konumlandırması kullanıyor.
Bryan Field

Bunu etkileşimli (form alanı) PDF'lerle yapan var mı, böylece tarayıcıda etkileşimli kalsınlar ve INPUT'ları oluşturulan SVG'nin üzerine bindiriyor olabilir mi?
Tim

Yanıtlar:


84

Inkscape, Wikipedia'daki birçok kişi tarafından PDF'yi SVG'ye dönüştürmek için kullanılıyor.

http://inkscape.org/

Bunun nasıl yapılacağına dair kullanışlı bir kılavuzları bile var!

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


4
Inkscape, metni yollara dönüştürdüğü için çok iyi çalışmıyor. Ayrıca yazı tipi verilerini sık sık kaybettiklerini, ancak iyi, yüklü bir yazı tipine yaklaşmadıklarını görüyorum. SVG görüntüleyemezse PDF bunu nasıl görüntüler?
DanRedux

Bu mantıklı bir soru, her iki formata da aşinayım ancak konu hakkında çok fazla araştırma yapmadım. Bir bakabilirim. İki formatın oluşturulma şekline indirgenebileceğini düşünüyor. Örneğin SVG, XML ile oluşturulmuşken, PDF kendi XML Türü biçimini kullanır.
Saintt Sheldon Patnett

3
Bunu istememin nedeni, metni PHP kullanarak düzenleyebilmek istemem. Bunu doğrudan PDF ile yapabilirdim, ancak PDF HTML'ye kolayca satır içi olarak eklenemez, ancak SVG yapabilir. PDF'ye sadık
kalarak

8
@DanRedux: AFAIK, Inkscape'de 'yazı tipi metinlerini yollara' dönüştürmeyi kapatabilirsiniz . Inkscape komut satırında ekleyerek bu dönüşümü etkinleştirirsiniz--export-text-to-path .
Kurt Pfeifle

1
Açık olabilir ancak Illustrator, PDF'yi SVG'ye dönüştürebilir. Buraya geldim, Inkscape'i indirdikten sonra Illustrator'ım olduğunu fark ettim. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin

84

Inkscape'i yalnızca komut satırında, bir GUI açmadan kullanabilirsiniz. Bunu dene:

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

Tüm komut satırı seçeneklerinin tam listesi için çalıştırın inkscape --help.


Bu benim için metindeki boşluğu kaldırıyor.
MaxNoe

1
@MaxNoe: Bu oldukça olası - ama bu, söz konusu PDF'nin dahili olarak nasıl oluşturulduğunun bir "özelliği". Konu PDF'lerden "metin" tanıma ve ayıklama olduğunda ortaya çıkan zorlukların bazı açıklamaları için GitHub'da elle kodlanmış PDF dosyalarıma (gömülü yorumlarla birlikte) bakın . (Seçimlerinizin yanı sıra bir PDF görüntüleyicide bir metin düzenleyicide açın ve dosyalardan metin kopyalayıp yapıştırın.)
Kurt Pfeifle

Evet, bunun tex'in beyaz boşluğu kutular gibi oluşturması ile ilgisi olduğunu düşünüyorum.
MaxNoe

23

Şu anda grafik çıktıları için iyi desteği olan PDFBox kullanıyorum . Vektör vuruşlarını çıkarmak ve yazı tiplerini yönetmek için iyi bir destek var. Denemek için bazı iyi araçlar var (örneğin, PDFReader Java Graphics2D olarak görüntülenecektir).Grafik aracını Batik gibi bir SVG aracıyla durdurabilirsiniz (bunu yapıyorum ve iyi bir görüntü yakalama sağlıyor).

Tüm PDF'yi SVG'ye dönüştürmenin basit bir yolu yoktur - bu, PDF'leri oluşturmak için kullanılan strateji ve araçlara bağlıdır. Bazı metinler vektörlere dönüştürülür ve kolayca yeniden oluşturulamaz - vektör yazı tiplerini yüklemeniz ve onlara bakmanız gerekir.

GÜNCELLEME: Şimdi bunu bir PDF2SVG paketine geliştirdim Batik kullanmayan :

çeşitli PDF'lerde test edilmiştir. Aşağıdakilerden oluşan SVG çıktı üretir

  • karakter <svg:text>başına bir karakter
  • yollar olarak <svg:path>
  • görüntüler <svg:image>

Daha sonraki paketler (umarız) karakterleri çalışan metne ve yolları daha yüksek seviyeli grafik nesnelerine dönüştürecektir.

GÜNCELLEME: Artık SVG karakterlerinden akan metni yeniden oluşturabiliriz. Ayrıca diyagramları alana özgü XML'e (örneğin kimyasal spektrumlar) dönüştürdük. Bkz. Https://bitbucket.org/petermr/svg2xml-dev . Hala Alpha'da, ancak kullanışlı bir hızda ilerliyor. Herkes katılabilir!

GÜNCELLEME. (@Tim Kelty) PDF2SVG ve ayrıca Java OCR (sınırlı) yapan ve daha üst düzey grafik temelleri (oklar, kutular, vb.) Oluşturan aşağı akış araçları üzerinde çalışmaya devam ediyoruz Bkz. Https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma ve https://bitbucket.org/petermr/ami-core . Bu, çoğu PDF olan bilimsel literatürden (contentmine.org) 100 milyon gerçeği yakalamak için finanse edilen bir projedir.


19

Bu konu oldukça eski, ancak bulduğum kullanışlı bir çözüm:

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

Bir kez kurulduktan sonra komut satırındaki işi tam olarak yapan bir araç olan pdf2png sunar. Şimdiye kadar, bit eşlemler dahil, onarılamaz sonuçlarla test ettim.

DÜZENLEME: Hatam, bu araç aynı zamanda harfleri yollara dönüştürür, bu nedenle ilk soruyu ele almaz. Ancak yine de iyi bir iş çıkarır ve svg dosyasındaki kodu değiştirmek istemeyen herkes için yararlı olabilir, bu yüzden gönderiyi bırakacağım.


Ubuntu'da şununla yükleyebilirsiniz: $ sudo apt-get install pdf2svg
tvw

2
Harfleri yollara dönüştürse de sonuçlar harika. Bazı değişiklikler yapmak için, SVG'leri doğrudan bir düzenleyicide düzenlerdim. Bunları inkscape ile inkscape SVG olarak açıp kaydederseniz, kod daha iyi görünür ve varlıkları kolayca bulmak için değiştirmek istediğiniz nesne kimliklerine sahip olursunuz.
tvw

1
Mac'e yükleyebilirsiniz brew install pdf2svg.
Colas

10

İşte kullanmaya son verdiğim süreç. Kullandığım ana araç, metni tamamen dönüştürebilen Inkscape idi.

  • PDF sayfalarını bölmek için JavaScript ile Adobe Acrobat Pro eylemlerini kullandı
  • Windows Cmd'den SVG'ye dönüştürmek için Inkscape Portable 0.48.5'i çalıştırdı
  • Windows Cmd ve Windows PowerShell kullanarak sorun yaşadığım belirli bir SVG XML özniteliğinde bazı manuel düzenlemeler yaptım

Ayrı Sayfalar: Adobe Acrobat Pro, JavaScript ile

Adobe Acrobat Pro Eylemlerini (eski adıyla Toplu İşleme) kullanarak, PDF sayfalarını ayrı dosyalara ayırmak için özel bir eylem oluşturun. Alternatif olarak PDF'leri GhostScript ile bölebilirsiniz

Acrobat JavaScript Action sayfaları bölmek için

/* 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'den SVG'ye Dönüştürme: Windows CMD toplu iş dosyası ile Inkscape

Windows Cmd'yi kullanarak, bir klasördeki tüm PDF dosyalarında döngü yapmak ve bunları SVG'ye dönüştürmek için toplu iş dosyası oluşturma

PDF'yi geçerli klasörde SVG'ye dönüştürmek için toplu iş dosyası

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

Temizleme öznitelikleri: Windows Cmd ve PowerShell

Olası varyasyonlardan dolayı SVG veya XML etiketlerini veya özniteliklerini manuel olarak kaba kuvvetle düzenlemenin en iyi uygulama olmadığını ve bunun yerine bir XML ayrıştırıcı kullanmanın en iyi uygulama olmadığını anlıyorum. Ancak, bir çizimdeki kontur genişliğinin çok küçük olduğu ve diğerinde font ailesinin yanlış tanımlandığı basit bir sorun yaşadım, bu yüzden basit bir bul ve değiştir yapmak için önceki Windows Cmd toplu komut dosyasını temelde değiştirdim. Tek değişiklik, arama dizesi tanımlarında ve bir PowerShell komutunu çağırmak için değiştirildi. PowerShell komutu, değiştirilen dosyayı bulup değiştirir ve eklenen bir sonekle kaydeder. Başka küçük bir temizleme yapılması gerekirse, ortaya çıkan SVG dosyalarını ayrıştırmak veya değiştirmek için daha iyi kullanılabilecek başka referanslar buldum.

SVG XML verilerini manuel olarak bulmak ve değiştirmek için değişiklikler

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

Umarım bu birine yardımcı olabilir

Referanslar

Adobe Acrobat Pro Eylemleri ve Ayrı Sayfalara JavaScript referansları

Ayrı Sayfalara GhostScript referansları

PDF'den SVG'ye Dönüştürme için Inkscape Komut Satırı referansları

Windows Cmd Toplu Dosya Komut Dosyası referansları

XML etiketi / nitelik değiştirme araştırması


7

DVI'dan SVG'ye bir seçenek varsa, bir DVI dosyasını bir SVG dosyasına dönüştürmek için dvisvgm'yi de kullanabilirsiniz . Bu, örneğin LaTeX formülleri için mükemmel çalışır (seçenekle birlikte --no-fonts):

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

Ayrıca bir pdf'yi SVG'ye dönüştürmek için poppler ve Cairo kullanan pdf2svg de vardır . Bunu denediğimde, SVG mükemmel bir şekilde görüntülendi inkscape.


1
Skak paketinden (satranç taşları) bazı LaTeX sembollerini işleyen bir PDF belgem var. Bu özel dosya Inkscape'de iyi işlenmiyor, çünkü semboller Arial harflerine dönüşüyor ... pdf2svg ile doğru sonuçlar aldım.
LRMAAX

Windows sistemleri için burada bir dizi derlenmiş ikili araç vardır: Windows için Poppler .
Paolo Gibellini

7

Bir PDF'nin her sayfasını kendi SVG dosyasına dönüştürmek için Bash betiği.

#!/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'de oluşturmak için kullanın --export-png, vb ...


1

Bunun xfigmükemmel bir iş çıkardığını buldum :

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

export to svg

Inkscape'den çok daha iyi iş çıkardı. Aslında bunu yapan muhtemelen pdtoedit idi.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.