转换PDF到干净的SVG?
我试图将PDF转换为SVG。 然而,我正在使用的那个目前正在为每一个文本中的每个字母都映射一个path,这意味着如果我改变其源文件中的文本,它看起来很丑。
我想知道最干净的PDF到SVG转换器是什么,希望没有一个文本区域,根本不需要一个path。 我们知道,PDF和SVG非常相似,所以我认为这里有一些很好的转换器。
Inkscape被维基百科上的许多人用来将PDF转换为SVG。
他们甚至有一个方便的指导如何做到这一点!
您只能在命令行上使用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转换