将PDF转换为干净的SVG?[关闭]


114

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

我想知道最干净的PDF到SVG转换器是什么,希望其中没有一个不需要文本路径的文本区域。众所周知,PDF和SVG非常相似,因此我认为这里有一些不错的转换器。


11
“我们知道,PDF和SVG相当相似...” ?!?!? 在这种情况下,您比我知道的更多……
Kurt Pfeifle 2012年

22
它们都是基于矢量的格式,因此它们是相似的。我相信这就是比较结束的地方。
弗兰克·雷姆

1
我想他们俩都使用大量的绝对文本位置。
布赖恩·菲尔德

是否有人使用交互式(表单域)PDF来执行此操作,以使它们在浏览器中保持交互性,也许将INPUT叠加在呈现的SVG上?
蒂姆(Tim)

Answers:


84

Wikipedia上许多人使用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年

这是一个公平的问题,我对这两种格式都很熟悉,但是我尚未对该主题进行大量研究。我可能会看看。它认为这可能归结为两种格式的构建方式。例如,SVG是用XML构建的,而PDF使用它自己的XML Type格式。
Saintt Sheldon Patnett 2012年

3
好吧,我想要这样做的原因是因为我希望能够使用PHP编辑文本。我可以直接用PDF做到这一点,但是PDF不能轻松地内联到HTML,但是SVG可以。我可能只是坚持PDF文件,并修改它的值之后转换成JPG在PHP ..
DanRedux

8
@DanRedux:AFAIK,您可以在Inkscape中关闭“字体文本到路径”转换。在Inkscape命令行上,您可以通过添加来启用此转换--export-text-to-path
Kurt Pfeifle

1
这可能很明显,但是Illustrator可以将PDF转换为SVG。来到这里,下载了Inkscape,然后意识到我有了Illustrator。 en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/...
E. Sundin的

83

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

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

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


这会为我删除文本中的空间。
MaxNoe '16

1
@MaxNoe:这是很有可能的-但这是内部构造特定PDF方式的“属性”。有关从PDF识别和提取“文本”时遇到的困难的一些解释,请参阅GitHub上我的手工编码的PDF文件(带有嵌入式注释)(在您选择的文本编辑器以及PDF查看器中打开它们,然后从文件中复制“粘贴”文本。)
Kurt Pfeifle16年

是的,我认为这与tex将空白呈现为盒子的方式有关。
MaxNoe

23

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

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

更新:我现在已经将其开发为一个不再使用蜡染的PDF2SVG包

已在一系列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。


19

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

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

它提供了一个pdf2png工具,该工具一经安装,就可以在命令行中准确地完成工作。到目前为止,我已经用无可指摘的结果(包括位图)对其进行了测试。

编辑:我的错误,此工具还将字母转换为路径,因此它不能解决最初的问题。但是无论如何它都能做得很好,并且对于不打算修改svg文件中代码的任何人都可能有用,所以我将继续介绍。


在Ubuntu上,您可以使用以下命令安装它:$ sudo apt-get install pdf2svg
tvw

2
尽管它将字母转换为路径,但效果很好。为了进行一些修改,我曾经使用编辑器直接编辑SVG。如果使用inkscape将它们打开并保存为inkscape SVG,则代码看起来会更好,并且具有对象ID,以便轻松查找要更改的实体。
tvw

1
您可以使用安装在Mac上brew install pdf2svg
Colas

10

这是我最终使用的过程。我使用的主要工具是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 Actions(以前称为Batch Processing)创建一个自定义操作,以将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%'"

希望这可以帮助某人

参考资料

Adobe Acrobat Pro Actions和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,它使用poppler和Cairo将pdf转换为SVG。当我尝试此操作时,SVG完美呈现在中inkscape


1
我有一个PDF,可从skak程序包(棋子)中渲染一些LaTeX符号。由于符号变成Arial字母,因此该特定文件在Inkscape中处理不佳。
LRMAAX

对于Windows系统,这里有一组已编译的二进制工具:Poppler for Windows
Paolo Gibellini,

7

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,等等。


1

我发现这xfig做得很好:

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

export to svg

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.