web-dev-qa-db-ja.com

PDFを変換してSVGをクリーンにしますか?

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

最もきれいなPDFからSVGへのコンバーターは何なのかと思っていました。知っているように、PDFとSVGはかなり似ているので、優れたコンバーターがいくつかあると思います。

106
DanRedux

InkscapeはPDFをSVGに変換するためにウィキペディアの多くの人々によって使用されています。

http://inkscape.org/

彼らはその方法についての便利なガイドさえ持っています!

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

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

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

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

81
Kurt Pfeifle

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

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

更新:私はこれを package PDF2SVG に開発しました。これはBatikをもう使用しません:

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

  • 文字ごとに1つの<svg:text>としての文字
  • <svg:path>としてのパス
  • <svg:image>としての画像

後のパッケージは、(できれば)文字を実行中のテキストに変換し、パスを高レベルのグラフィックオブジェクトに変換します

更新:SVG文字から実行中のテキストを再作成できるようになりました。また、ダイアグラムをドメイン固有のXML(化学スペクトルなど)に変換しました。 https://bitbucket.org/petermr/svg2xml-dev を参照してください。まだアルファ版ですが、便利な速度で動いています。誰でも参加できます!

更新。 (@Tim Kelty)私たちはPDF2SVGの作業を続けています。また、(制限付き)Java OCRと高レベルのグラフィックプリミティブ(矢印、ボックスなど)の作成を行うダウンストリームツールにも取り組んでいます。 https://bitbucket.org/petermr/imageanalysishttps://bitbucket.org/petermr/diagramanalyzerhttps://bitbucket.org/petermr/norma および https://bitbucket.org/petermr/AMI-core これは、科学文献(contentmine.org)から1億件の事実をキャプチャするための資金提供プロジェクトです。その多くはPDFです。

21

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

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

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

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

18
pierre

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

  • javaScriptでAdobe Acrobat Proアクションを使用してPDFシートを分割しました
  • inkscape Portable 0.48.5をWindows Cmdから実行して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パーサーを使用する必要があります。しかし、ある図面のストローク幅が非常に小さく、別のフォントファミリが誤って識別されるという単純な問題があったため、基本的に以前の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 Batch File Scriptリファレンス

XMLタグ/属性置換研究

9
ClearBlueSky85

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などを使用します...

7
Alain Pannetier

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

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

pdf2svg もあり、popplerとCairoを使用してpdfをSVGに変換します。これを試したとき、SVGはinkscapeで完全にレンダリングされました。

6
dhaumann

xfigは素晴らしい仕事をしたことがわかりました。

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

export to svg

Inkscapeよりもはるかに良い仕事をしました。実際、それを行ったのはおそらくpdtoeditでした。

1
user877329

NodeJS REST AP​​Iは、2つのPDFレンダリングスクリプト用です。 https://github.com/pumppi/pdf2images

スクリプト:pdf2svgおよびImagemagicks変換

0
user257980