关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 4年前关闭。改进这个问题
我正在尝试将 PDF 转换为 SVG。但是,我目前使用的那个为每段文本中的每个字母映射一个路径,这意味着如果我更改其源文件中的文本,它看起来很难看。
我想知道最干净的 PDF 到 SVG 转换器是什么,希望它没有路径,它的文本区域根本不需要。众所周知,PDF 和 SVG 非常相似,所以我认为那里有一些不错的转换器。
您只能在命令行上使用 Inkscape,而无需打开 GUI。尝试这个:
inkscape \
--without-gui \
--file=input.pdf \
--export-plain-svg=output.svg
有关所有命令行选项的完整列表,请运行 inkscape --help
。
Wikipedia 上的许多人使用 Inkscape 将 PDF 转换为 SVG。
他们甚至有一个方便的指南,告诉你如何做到这一点!
--export-text-to-path
启用此转换。
我目前正在使用PDFBox,它对图形输出有很好的支持。对提取矢量笔画和管理字体有很好的支持。有一些很好的工具可以试用(例如 PDFReader 将显示为 Java Graphics2D)。 您可以使用像 Batik 这样的 SVG 工具截取图形工具(我这样做了,它可以很好地捕捉)。
没有简单的方法将所有 PDF 转换为 SVG - 这取决于用于创建 PDF 的策略和工具。一些文本被转换为矢量,无法轻松重建 - 您必须安装矢量字体并查找它们。
更新:我现在已将其开发为不再使用蜡染的 package PDF2SVG:
已经在一系列 PDF 上进行了测试。它产生 SVG 输出,包括
每个字符一个
路径为
图片为
以后的包将(希望)将字符转换为运行文本,并将路径转换为更高级别的图形对象
更新:我们现在可以从 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
在 Mac 上安装它。
这是我最终使用的过程。我使用的主要工具是 Inkscape,它能够很好地转换文本。
使用带有 JavaScript 的 Adobe Acrobat Pro 操作来拆分 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 操作
/* 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 转换:Inkscape 与 Windows CMD 批处理文件
使用 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 操作和 JavaScript 对单独页面的引用
如何自动从 PDF 中提取页面...
适用于 Acrobat API 的 JavaScript 参考 - extractPages
提取页面以分隔pdf(循环有问题吗?)
如何使用 JavaScript 创建 Zerofilled 值?
如何在 JavaScript 中输出带有前导零的整数
GhostScript 对单独页面的引用
GhostScript noob 帮助 - 破坏多页 PDF 文件...
如何转换多页PDF文件...
使用 Ghostscript 分割 PDF
PDF 到 SVG 转换的 Inkscape 命令行参考
将pdf转换为svg
将 PDF 转换为干净的 SVG?
Windows Cmd 批处理文件脚本参考
Windows批处理文件的隐藏功能
SS64.com - Windows CMD 命令行的索引
为什么这个批处理脚本中的 FOR /f 循环评估一个空行?
XML标签/属性替换研究
如何使用 Windows 命令行环境查找和替换文件中的文本?
使用 Windows 批处理文件更改 XML 文件中的标记数据
从命令行更新 XML [windows]
如何使用 PowerShell 在 XML 文件中修改/创建值?
使用 Powershell 编辑 XML 属性
powershell 更改 XML Element 属性的值
for /l %i in (1,1,58) Do @%inkscape% --pdf-page %i ...
分隔页面并将它们直接转换为 svg
如果 DVI 到 SVG 是一个选项,您还可以使用 dvisvgm 将 DVI 文件转换为 SVG 文件。例如,这对于 LaTeX 公式(带有选项 --no-fonts
)非常有效:
dvisvgm --no-fonts input.dvi -o output.svg
还有 pdf2svg 使用 poppler 和 Cairo 将 pdf 转换为 SVG。当我尝试这个时,SVG 在 inkscape
中完美呈现。
用于将 PDF 的每一页转换为自己的 SVG 文件的 Bash 脚本。
#!/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
等...
我发现 xfig
做得很好:
pstoedit -f fig foo.pdf foo.fig
xfig foo.fig
export to svg
它比inkscape做得更好。实际上可能是 pdtoedit 做到了。
不定期副业成功案例分享
--without-gui
至少在 inkscape 1.0.1 中已弃用inkscape --export-type="svg" input.pdf