PDFをクリーンなSVGに変換しますか?[閉まっている]


114

PDFをSVGに変換しようとしています。ただし、現在使用しているものは、すべてのテキストのすべての文字のパスをマップしています。つまり、ソースファイルのテキストを変更すると、見栄えが悪くなります。

PDFからSVGへの最もきれいなコンバーターは何なのか、と思っていました。うまくいけば、テキスト領域へのパスがなく、単純にそれを必要としないものです。ご存じのとおり、PDFとSVGはかなり似ているため、優れたコンバーターがいくつかあると思います。


11
「私たちが知っているように、PDFとSVGはかなり似ています...」 ?!?!? その場合、あなたは私よりもはるかに多くのことを知っています...
カートファイフル2012

22
これらはどちらもベクターベースの形式であるという意味で似ています。ここで比較が終了すると思います。
フランクRem

1
どちらもテキストの絶対配置を多く使用していると思います。
ブライアンフィールド

インタラクティブな(フォームフィールド)PDFでこれを行って、ブラウザーでインタラクティブなままにして、レンダリングされたSVGにINPUTを重ねる人はいますか?
Tim

回答:


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は、テキストもパスに変更するため、うまく機能しません。また、フォントデータが失われることがよくありますが、インストールされている適切なフォントに近いものではないようです。SVGが表示できない場合、PDFはどのように表示しますか?
DanRedux 2012

それは公平な質問です。私は両方の形式に精通していますが、このトピックについて多くの調査を行っていません。調べてみるかもしれません。それは2つのフォーマットが構築される方法に要約されるかもしれないと思います。たとえば、SVGはXMLで構築されていますが、PDFは独自のXMLタイプ形式を使用しています。
Saintt Sheldon Patnett

3
まあ、これが必要な理由は、PHPを使用してテキストを編集できるようにするためです。PDFで直接行うこともできますが、PDFをHTMLに簡単にインライン化することはできませんが、SVGはインライン化できます。私はちょうど.. PDFに固執し、それの値を編集した後、PHPにJPGに変換する
DanRedux

8
@DanRedux:AFAIK、Inkscapeで「フォントテキストからパスへ」変換オフに切り替えることができます。Inkscapeコマンドラインで、を追加してこの変換を有効にします--export-text-to-path
カートファイフル2012

1
当たり前かもしれませんが、IllustratorはPDFをSVGに変換できます。ここに来て、ダウンロードしたInkscapeは、私がイラストレーターを持っていることに気づきました。 en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/...
E.サンディン

83

GUIを開かずにコマンドラインでのみInkscapeを使用できます。これを試して:

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

すべてのコマンドラインオプションの完全なリストについては、を実行してくださいinkscape --help


これにより、テキストのスペースが削除されます。
MaxNoe 2016

1
@MaxNoe:それはかなり可能です-しかし、これは特定のPDFが内部的に構築される方法の「プロパティ」です。PDFから「テキスト」を認識して抽出する際の問題のいくつかの説明については、GitHubで手作業でコーディングしたPDFファイル(コメントが埋め込まれている)を参照してください(お好みのテキストエディターとPDFビューアで開き、ファイルからテキストをコピーアンドペーストします。)
Kurt Pfeifle

ええ、それは、texが空白をボックスとしてレンダリングする方法に関係していると思います。
MaxNoe 2016

23

私は現在、グラフィック出力をサポートするPDFBoxを使用しています。ベクターストロークの抽出とフォントの管理もサポートされています。試してみるのに適したツールがいくつかあります(たとえば、PDFReaderはJava Graphics2Dとして表示されます)。BatikのようなSVGツールでグラフィックスツールをインターセプトできます(私はこれを行います。

すべてのPDFをSVGに変換する簡単な方法はありません。PDFの作成に使用される戦略とツールによって異なります。一部のテキストはベクターに変換され、簡単に再構築できません。ベクターフォントをインストールして検索する必要があります。

更新:私はこれをこれ以上Batikを使用しないパッケージPDF2SVGに開発しました:

さまざまなPDFでテストされています。それはで構成されるSVG出力を生成します

  • 文字<svg:text>ごとに1つの文字
  • パスとして <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。これは、ほとんどがPDFである科学文献(contentmine.org)から1億の事実を収集するための資金提供プロジェクトです。


19

このトピックはかなり古いですが、ここに私が見つけた便利な解決策があります:

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

これは、pdf2pngというツールを提供します。このツールをインストールすると、コマンドラインで正確に機能します。これまでに、ビットマップを含め、非の打ちどころのない結果でテストしました。

編集:私の間違い、このツールは文字をパスに変換するため、最初の質問には対応していません。しかし、とにかくそれは良い仕事をし、svgファイルのコードを変更するつもりのない人には役立つので、投稿は残しておきます。


Ubuntuでは、次のコマンドでインストールできます:$ sudo apt-get install pdf2svg
tvw

2
文字をパスに変換しますが、結果は素晴らしいです。いくつかの変更を加えるために、私はエディターで直接SVGを編集するために使用しました。それらをinkscapeでインクスケープSVGとして開いて保存すると、コードの見栄えが良くなり、オブジェクトIDがあるので、エンティティを簡単に見つけて変更したいと考えています。
tvw

1
Macにでインストールできbrew install pdf2svgます。
コーラス2017年

10

これが私が最終的に使用したプロセスです。私が使用した主なツールは、テキストを問題なく変換できるInkscapeでした。

  • JavaScriptでAdobe Acrobat Proアクションを使用してPDFシートを分割
  • Windows CmdからInkscape Portable 0.48.5を実行してSVGに変換しました
  • Windows CmdとWindows PowerShellを使用して問題が発生していた特定のSVG XML属性を手動で編集した

別のページ:JavaScriptを使用したAdobe Acrobat Pro

Adobe Acrobat Proアクション(以前のバッチ処理)を使用して、PDFページを個別のファイルに分割するカスタムアクションを作成します。または、GhostScriptを使用してPDFを分割できる場合があります。

ページを分割する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への変換:Windows CMDバッチファイルを使用したInkscape

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パーサーを使用する必要があることを理解しています。ただし、1つの図面のストローク幅が非常に小さく、別のフォントファミリーが誤って識別されるという単純な問題があったため、基本的に以前の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参照

PDFからSVGへの変換のためのInkscapeコマンドラインリファレンス

Windows Cmdバッチファイルスクリプトのリファレンス

XMLタグ/属性置換研究


7

DVIからSVGがオプションである場合、dvisvgmを使用してDVIファイルをSVGファイルに変換することもできます。これは、たとえばLaTeX数式(オプション--no-fonts)に対して完全に機能します。

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

ありpdf2svg SVGにPDFファイルを変換するのpopplerやカイロを使用しています。これを試したところ、SVGはで完全にレンダリングされましたinkscape


1
私はskakパッケージ(チェスの駒)からいくつかのLaTeXシンボルをレンダリングするPDFを持っています。シンボルがArial文字になるため、この特定のファイルはInkscapeではうまく処理されません... pdf2svgで正しい結果を得ました。
LRMAAX 2013

Windowsシステムの場合、Poppler for Windowsという一連のコンパイル済みバイナリツールがあります
Paolo Gibellini、

7

PDFの各ページを独自のSVGファイルに変換するBashスクリプト。

#!/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でした。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.