Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将PDF转换为干净的SVG?_Pdf_Svg - Fatal编程技术网

将PDF转换为干净的SVG?

将PDF转换为干净的SVG?,pdf,svg,Pdf,Svg,我正在尝试将PDF转换为SVG。然而,我目前使用的一个映射了每段文本中每个字母的路径,这意味着如果我更改其源文件中的文本,它看起来很难看 我想知道什么是最干净的PDF-to-SVG转换器,希望它的文本区域不需要路径。正如我们所知,PDF和SVG非常相似,所以我假设有一些很好的转换器。Inkscape被维基百科上的许多人用来将PDF转换为SVG 他们甚至有一个方便的指南如何做到这一点 您只能在命令行上使用Inkscape,而无需打开GUI。试试这个: inkscape \ --without

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


我想知道什么是最干净的PDF-to-SVG转换器,希望它的文本区域不需要路径。正如我们所知,PDF和SVG非常相似,所以我假设有一些很好的转换器。

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

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


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

inkscape \
  --without-gui \
  --file=input.pdf \
  --export-plain-svg=output.svg 
要获得所有命令行选项的完整列表,请运行
inkscape--help

我当前使用的对图形输出有良好支持的工具。对于提取矢量笔划和管理字体都有很好的支持。有一些很好的工具可以试用(例如,PDFReader将显示为Java Graphics2D)。您可以使用类似Batik的SVG工具截取图形工具(我这样做,它提供了很好的捕获)

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

更新: 我现在已将其开发成不再使用蜡染的:

已经在一系列PDF上进行了测试。它生成SVG输出,包括

  • 每个字符作为一个
  • 路径为
  • 图像显示为
稍后的包(希望)将字符转换为运行文本,并将路径转换为更高级的图形对象

更新: 现在,我们可以从SVG字符重新创建运行文本。我们还将图表转换为特定领域的XML(例如化学光谱)。看见它仍然在阿尔法,但正在以有用的速度移动。任何人都可以加入


更新。(@Tim Kelty)我们正在继续研究PDF2SVG和下游工具,这些工具可以(有限地)进行Java OCR和创建更高级的图形原语(箭头、方框等),请参见和。这是一个获得资助的项目,旨在从科学文献(contentmine.org)中获取1亿个事实,其中大部分是PDF。

如果选择DVI到SVG,您还可以使用将DVI文件转换为SVG文件。例如,对于LaTeX公式(使用选项<代码>--无字体),这非常有效:


还有一种方法使用poppler和Cairo将pdf转换为SVG。当我尝试这样做时,SVG在
inkscape

中得到了完美的渲染,我发现
xfig
做得非常好:

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

export to svg

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

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

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


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

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

  • 使用AdobeAcrobatPro操作和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操作
/*将页面提取到文件夹*/
var re=/.\/\.pdf$/ig;
var filename=this.path.replace(re,“”);
{
对于(var i=0;i
PDF到SVG的转换:带有Windows CMD批处理文件的Inkscape 使用Windows Cmd创建批处理文件,循环遍历文件夹中的所有PDF文件,并将其转换为SVG

将当前文件夹中的PDF转换为SVG的批处理文件
:=======设置=====
@回音
CLS
正在启动SVG转换。。。
回声。
::设置工作目录(如果不同)
REM集合“\u work\u dir=%~dp0”
设置“\u工作\u目录=%CD%”
::设置计数器
设置“计数=1”
::设置文件搜索和保存字符串
设置“_work_x1=pdf”
设置“\u work\u x2=svg”
设置“\u工作\u文件\u str=*.%\u工作\u x1%”
::设置inkscape命令
设置“\u inkscape\u path=D:\InkscapePortable\App\inkscape\”
设置“\u inkscape\u cmd=%\u inkscape\u路径%inkscape.exe”
:====在工作目录中查找文件=====
::DIR最后一个元素的输出是单回车字符。
::在百分比扩展后直接删除回车字符,
::但不能延迟扩展。
pushd“%\u工作目录%”
对于/f“tokens=*”%%A IN('DIR/A:-D/O:N/B%\u work\u file\u str%')DO(
调用:子例程“%%A”
)
邻苯二胺
:====使用INKSCAPE将PDF转换为SVG=====
:子程序
回声。
如果不是[%1]=[](
回显%count%:%1
设置/A计数+=1
开始“/D”%\u work\u dir%”/W“%\u inkscape\u cmd%”--不带gui--文件=“%~n1.%\u work\u x1%”--导出dpi=300--导出普通svg=“%~n1.%\u work\u x2%”
)否则(
回波输出端
)
回声。
后藤:eof
:====INKSCAPE参考=====
::打印inkscape帮助
REM“%\u inkscape\u cmd%--help>”%~dp0\inkscape\u help.txt”
REM“%\u inkscape\u cmd%”——动词列表>“%~dp0\inkscape\u verb\u list.txt”
清理属性:Windows Cmd和PowerShell 我意识到这不是最好的做法
pstoedit -f fig foo.pdf foo.fig
xfig foo.fig

export to 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