我正在尝试将PDF转换为SVG。但是,我目前正在使用的那个为每个文本中的每个字母都映射了一个路径,这意味着如果我更改其源文件中的文本,它看起来很丑。
我想知道最干净的PDF到SVG转换器是什么,希望其中没有一个不需要文本路径的文本区域。众所周知,PDF和SVG非常相似,因此我认为这里有一些不错的转换器。
我正在尝试将PDF转换为SVG。但是,我目前正在使用的那个为每个文本中的每个字母都映射了一个路径,这意味着如果我更改其源文件中的文本,它看起来很丑。
我想知道最干净的PDF到SVG转换器是什么,希望其中没有一个不需要文本路径的文本区域。众所周知,PDF和SVG非常相似,因此我认为这里有一些不错的转换器。
Answers:
Wikipedia上许多人使用Inkscape将PDF转换为SVG。
他们甚至还提供了有关如何操作的便捷指南!
--export-text-to-path
。
您只能在命令行上使用Inkscape,而无需打开GUI。试试这个:
inkscape \
--without-gui \
--file=input.pdf \
--export-plain-svg=output.svg
有关所有命令行选项的完整列表,请运行inkscape --help
。
我目前正在使用对图形输出有良好支持的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/norma和https://bitbucket.org/petermr/ami-core。这是一个受资助的项目,旨在从科学文献(contentmine.org)中捕获1亿个事实,其中大部分是PDF。
这个主题已经很老了,但是这是我发现的一个方便的解决方案:
http://www.cityinthesky.co.uk/opensource/pdf2svg/
它提供了一个pdf2png工具,该工具一经安装,就可以在命令行中准确地完成工作。到目前为止,我已经用无可指摘的结果(包括位图)对其进行了测试。
编辑:我的错误,此工具还将字母转换为路径,因此它不能解决最初的问题。但是无论如何它都能做得很好,并且对于不打算修改svg文件中代码的任何人都可能有用,所以我将继续介绍。
brew install pdf2svg
。
这是我最终使用的过程。我使用的主要工具是Inkscape,它可以转换文本。
使用Adobe Acrobat Pro Actions(以前称为Batch Processing)创建一个自定义操作,以将PDF页面分成单独的文件。另外,您也可以使用GhostScript拆分PDF
/* 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"
});
};
使用Windows Cmd创建的批处理文件循环浏览文件夹中的所有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"
我意识到,由于潜在的变化,手动蛮力编辑SVG或XML标签或属性不是最佳做法,应改用XML解析器。但是,我有一个简单的问题,其中一个绘图上的笔划宽度很小,而在另一幅上字体标识不正确,因此我基本上修改了以前的Windows Cmd批处理脚本以进行简单的查找和替换。唯一的更改是对搜索字符串定义的更改,并更改为调用PowerShell命令。PowerShell命令将执行查找并替换并保存修改后的文件,并添加后缀。我确实找到了一些其他引用,如果需要执行其他一些小的清理操作,则可以更好地用于解析或修改生成的SVG文件。
:: 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%'"
希望这可以帮助某人
如果将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
,等等。
这是两个PDF渲染脚本的NodeJS REST API。 https://github.com/pumppi/pdf2images
脚本为:pdf2svg和Imagemagicks转换