转换PDF到干净的SVG?

我试图将PDF转换为SVG。 然而,我正在使用的那个目前正在为每一个文本中的每个字母都映射一个path,这意味着如果我改变其源文件中的文本,它看起来很丑。

我想知道最干净的PDF到SVG转换器是什么,希望没有一个文本区域,根本不需要一个path。 我们知道,PDF和SVG非常相似,所以我认为这里有一些很好的转换器。

Inkscape被维基百科上的许多人用来将PDF转换为SVG。

http://inkscape.org/

他们甚至有一个方便的指导如何做到这一点!

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

您只能在命令行上使用Inkscape,而无需打开GUI。 尝试这个:

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

有关所有命令行选项的完整列表,请运行inkscape --help

我目前正在使用PDFBox ,它对graphics输出有很好的支持。 对提取vector笔画以及pipe理字体有很好的支持。 有一些很好的工具可以试用(例如PDFReader将显示为Java Graphics2D)。 你可以用像Batik这样的SVG工具截取这个graphics工具(我这样做,它可以很好的捕捉)。

没有简单的方法将所有PDF转换为SVG – 这取决于用于创buildPDF的策略和工具。 一些文本被转换成vector,不能轻易重build – 你必须安装vector字体并查找它们。

更新:我现在已经开发了一个不使用Batik的包PDF2SVG :

已经在一系列PDF文件上进行了testing。 它产生包含的SVG输出

  • 字符作为一个<svg:text>每个字符
  • path为<svg:path>
  • 图像为<svg:image>

后来的软件包将(希望)将字符转换为正在运行的文本和通往更高级别graphics对象的path

更新:我们现在可以从SVG字符重新创build运行文本。 我们还将图表转换为领域特定的XML(例如化学图谱)。 请参阅https://bitbucket.org/petermr/svg2xml-dev 。 它仍然在阿尔法,但正在有用的速度。 任何人都可以join!

UPDATE。 (@Tim Kelty)我们正在继续研究PDF2SVG以及下游工具(限制)Java OCR和创build更高级的graphics基元(箭头,框等)。请参阅https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma和https://bitbucket.org/petermr/ami-core 。 这是一个资助项目,可以从科学文献(contentmine.org)中获得1亿个事实,其中大部分是PDF。

这个话题是相当古老的,但这里是一个方便的解决scheme,我发现:

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

它提供了一个工具,pdf2png,曾经安装完成在命令行中的工作。 到目前为止,我已经用无可指责的结果对它进行了testing,包括位图。

编辑:我的错误,这个工具也将字母转换为path,所以它不解决最初的问题。 然而,它仍然做得很好,对任何不打算修改svg文件中的代码的人都是有用的,所以我将离开这个post。

这是我最终使用的过程。 我使用的主要工具是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操作(以前称为批处理)创build一个自定义操作,将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转换:Inkscape与Windows CMDbatch file

使用Windows Cmd创build的batch file来遍历文件夹中的所有PDF文件并将其转换为SVG

batch file将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标记或属性并不是最佳实践,应该使用XMLparsing器。 然而,我有一个简单的问题,一个绘图的笔画宽度非常小,另一个字体家族被错误地识别,所以我基本上修改了以前的Windows Cmd批处理脚本来做一个简单的查找和replace。 唯一的变化是searchstring定义和改变来调用PowerShell命令。 PowerShell命令将执行查找并replace,并用添加的后缀保存修改后的文件。 我find了一些其他的引用,如果需要执行一些其他的小清理,可能会更好地parsing或修改所得到的SVG文件。

修改手动查找和replaceSVG 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引用

  • 如何自动从PDF中提取页面…
  • JavaScript for Acrobat API参考 – extractPages
  • 提取页面以分离PDF(循环错误?)
  • 我如何使用JavaScript创buildZerofilled值?
  • 如何在JavaScript中输出前导零的整数

GhostScript引用分离页面

  • GhostScript的noob帮助 – 打破多页PDF文件…
  • 如何转换多页PDF文件…
  • 用Ghostscript分割PDF

Inkscape命令行参考PDF到SVG转换

  • 将PDF转换为SVG
  • 转换PDF到干净的SVG?

Windows Cmdbatch file脚本引用

  • Windowsbatch file的隐藏function
  • SS64.com – Windows CMD命令行的索引
  • 为什么在这个批处理脚本中的FOR / f循环评估一个空行?

XML标签/属性replace研究

  • 如何使用Windows命令行环境查找和replace文件中的文本?
  • 使用Windowsbatch file更改XML文件中的标签数据
  • 从命令行更新XML [windows]
  • 如何使用PowerShell修改/创buildXML文件中的值?
  • 使用Powershell编辑XML属性
  • PowerShell改变XML元素属性的值

如果DVI到SVG是一个选项,您也可以使用dvisvgm将DVI文件转换为SVG文件。 这适用于LaTeX公式(可选项--no-fonts ):

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

还有pdf2svg ,它使用poppler和Cairo将PDF转换为SVG。 当我尝试这个,SVG完美呈现inkscape

Bash脚本将PDF的每个页面转换为自己的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 

要在png中生成,请使用--export-png等…

我发现xfig做得很好:

 pstoedit -f fig foo.pdf foo.fig xfig foo.fig export to svg 

它比景物做得好得多。 其实这可能是pdtoedit做到了。

你可以使用http://image.online-convert.com/convert-to-svg 。 这在我的经验中运作良好。

这里是两个PDF渲染脚本的NodeJS REST API。 https://github.com/pumppi/pdf2images

脚本是:pdf2svg和Imagemagicks转换