将PDF转换为清洁SVG?

时间:2012-04-23 20:48:37

标签: pdf svg

我正在尝试将PDF转换为SVG。但是,我正在使用的那个当前映射每个文本中每个字母的路径,这意味着如果我更改其源文件中的文本,它看起来很难看。

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

9 个答案:

答案 0 :(得分:82)

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

http://inkscape.org/

他们甚至有一个如何操作的方便指南!

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

答案 1 :(得分:81)

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

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

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

答案 2 :(得分:20)

我目前正在使用PDFBox,它对图形输出有很好的支持。提取矢量笔划以及管理字体都有很好的支持。有一些很好的工具可以尝试(例如PDFReader将显示为Java Graphics2D)。 您可以使用像Batik这样的SVG工具拦截图形工具(我这样做并且可以很好地捕获)。

没有简单的方法可以将所有PDF转换为SVG - 这取决于用于创建PDF的策略和工具。有些文本转换为矢量,无法轻松重建 - 您必须安装矢量字体并查找它们。

更新: 我现在把它发展成package PDF2SVG,不再使用Batik了:

已在一系列PDF上测试过。它产生由

组成的SVG输出
  • 每个字符为<svg:text>个字符
  • 路径为<svg:path>
  • 图片为<svg:image>

以后的包将(希望)将字符转换为正在运行的文本和更高级图形对象的路径

更新: 我们现在可以从SVG字符重新创建运行文本。我们还将图表转换为特定于域的XML(例如化学光谱)。见https://bitbucket.org/petermr/svg2xml-dev。它仍然在Alpha中,但正在以有用的速度移动。任何人都可以加入!

更新。 (@Tim Kelty)我们将继续研究PDF2SVG以及执行(有限的)Java OCR和创建更高级图形基元(箭头,方框等)的下游工具。请参阅https://bitbucket.org/petermr/imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/normahttps://bitbucket.org/petermr/ami-core。这是一个资助项目,从科学文献(contentmine.org)中捕获1亿个事实,其中大部分是PDF。

答案 3 :(得分:17)

这个主题很老了,但我发现这是一个方便的解决方案:

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

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

编辑:我的错误,这个工具也将字母转换为路径,所以它没有解决最初的问题。然而,无论如何它都做得很好,并且对于不打算修改svg文件中的代码的任何人都有用,所以我将离开帖子。

答案 4 :(得分:9)

这是我最终使用的过程。我使用的主要工具是Inkscape,它能够正确转换文本。

  • 使用Adobe Acrobat Pro操作与JavaScript分割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 Action

/* 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%'"

希望这可以帮助某人

参考

Adob​​e Acrobat Pro对分离页面的操作和JavaScript引用

GhostScript引用“分离页面”

用于PDF到SVG转换的Inkscape命令行参考

Windows Cmd批处理文件脚本引用

XML标记/属性替换研究

答案 5 :(得分:7)

Bash脚本将PDF的每个页面转换为自己的SVG文件。

\{1,\}

要在png中生成,请使用onTableDataScroll: function (e) { var offset = $(e.currentTarget).scrollLeft(); if(UserSettings.get('direction').isRTL) { var bodyClientWidth = e.currentTarget.clientWidth; var tableBodyWidth = $(e.currentTarget).children('.table').outerWidth(); e.data.$('.data_scroll_head table').css('margin-right', bodyClientWidth - tableBodyWidth + offset); } else { e.data.$('.data_scroll_head table').css('margin-left', -1 * offset); } e.data.options.offset = offset; },等...

答案 6 :(得分:6)

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

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

还有pdf2svg使用poppler和Cairo将pdf转换为SVG。当我尝试这个时,SVG完全呈现在inkscape

答案 7 :(得分:1)

我发现xfig做得很好:

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

export to svg

它比inkscape做得好得多。实际上可能是pdtoedit做到了。

答案 8 :(得分:0)

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

脚本是:pdf2svg和Imagemagicks转换