将 PDF 转换为清洁 SVG? ?

我正试图把一个 PDF 文件转换成 SVG 文件。然而,我目前使用的一个地图的每个字母在每段文本的路径,这意味着如果我改变其源文件中的文本,它看起来很丑陋。

I was wondering what the cleanest PDF to SVG converter is, hopefully one that doesn't have a path for it's text areas that simply don't need one. As we know, PDF and SVG are fairly similar, so I assume there's some good converters out there.

158824 次浏览

维基百科上很多人使用 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

I am currently using PDF 文件夹 which has good support for graphic output. There is good support for extracting the vector strokes and also for managing fonts. There are some good tools for trying it out (e.g. PDFReader will display as Java Graphics2D). 您可以使用像 Batik 这样的 SVG 工具拦截图形工具(我这样做,它提供了很好的捕捉)。

没有一种简单的方法可以将所有 PDF 转换成 SVG-这取决于创建 PDF 的策略和工具。有些文本被转换成矢量,不容易重建-你必须安装矢量字体并查找它们。

更新: 我现在已经发展成一个 软件包 PDF2SVG,它不再使用蜡染:

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

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

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

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

更新。(@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 文档。

If DVI to SVG is an option, you can also use Dvisvgm to convert a DVI file to an SVG file. This works perfectly for instance for LaTeX formulas (with option --no-fonts):

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

还有 pdf2svg使用 poppler 和 Cairo 将 pdf 转换成 SVG。当我尝试这样做时,SVG 在 inkscape中得到了完美的呈现。

我发现 xfig做得很好:

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


export to svg

它做得比墨水画好多了。实际上可能是 pdtoedit 做的。

这个话题很老了,但是我找到了一个方便的解决办法:

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

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

编辑: 我的错误,这个工具也转换字母到路径,所以它没有解决最初的问题。不管怎样,它做得很好,而且对于那些不打算修改 svg 文件中的代码的人很有用,所以我就不写这篇文章了。

下面是我最终使用的过程。我使用的主要工具是 Inkscape,它可以很好地转换文本。

  • 使用 AdobeAcrobatPro 动作和 JavaScript 分割 PDF 表格
  • 从 Windows Cmd 运行 Inkscape Portable 0.48.5以转换为 SVG
  • 使用 Windows Cmd 和 Windows PowerShell 对特定的 SVG XML 属性进行了一些手动编辑

独立页面: 使用 JavaScript 的 AdobeAcrobat 专业版

使用 Adobe Acrobat Pro Actions (以前是批处理)创建一个自定义操作,将 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 的转换: 使用 WindowsCMD 批处理文件的 Inkscape

使用 WindowsCmd 创建批处理文件来遍历文件夹中的所有 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"

清理属性: WindowsCmd 和 PowerShell

我意识到,由于潜在的变化,手动强制编辑 SVG 或 XML 标记或属性并不是最佳实践,因此应该使用 XML 解析器。然而,我遇到了一个简单的问题,一个绘图上的笔画宽度非常小,而另一个绘图上的字体系列标识不正确,所以我基本上修改了以前的 Windows Cmd 批处理脚本,以便进行简单的查找和替换。唯一的更改是搜索字符串定义和更改为调用 PowerShell 命令。PowerShell 命令将执行查找和替换,并使用添加的后缀保存修改后的文件。我确实发现了一些其他的引用,如果需要执行其他一些小的清理,这些引用可以更好地用于解析或修改结果 SVG 文件。

手动查找和替换 SVGXML 数据的修改

:: 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%'"

希望这个能帮到别人

参考文献

AdobeAcrobatProActions 和对独立页面的 JavaScript 引用

对单独页面的 GhostScript 引用

PDF 到 SVG 转换的 Inkscape 命令行引用

批处理文件脚本引用

XML 标记/属性替换研究

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

Here is the NodeJS REST api for two PDF render scripts. https://github.com/pumppi/pdf2images

脚本是: pdf2svg 和 Imagemagicks 转换