将PDF转换为清洁SVG?

Dan*_*dux 107 pdf svg

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

我想知道什么是最干净的PDF到SVG转换器是什么,希望有一个没有路径的文本区域,根本不需要一个.我们知道,PDF和SVG非常相似,所以我假设有一些好的转换器.

Sai*_*ett 83

维基百科上的许多人都使用Inkscape将PDF转换为SVG.

http://inkscape.org/

他们甚至有一个方便的指导如何这样做!

http://en.wikipedia.org/wiki/Wikipedia:Graphic_Lab/Resources/PDF_conversion_to_SVG#Conversion_with_Inkscape

  • @DanRedux:AFAIK,您可以在Inkscape中关闭*'字体文本到路径'*转换.在Inkscape命令行中,您可以通过添加`--export-text-to-path`来启用*此转换. (8认同)
  • Inkscape不能很好地工作,因为它也将文本更改为路径.我还发现他们经常丢失字体数据,但似乎并不接近一个好的,已安装的字体.如果SVG不能,PDF如何显示? (4认同)
  • 好吧,我想要这个的原因是因为我希望能够使用PHP编辑文本.我可以直接使用PDF来完成它,但PDF不能很容易地嵌入到HTML中,但SVG可以.我可能只是坚持使用PDF并在编辑它的值后将其转换为PHP格式的JPG. (3认同)
  • 这可能是显而易见的,但 Illustrator 可以将 PDF 转换为 SVG。来到这里,下载了 Inkscape,然后意识到我有 Illustrator。http://en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/PDF_conversion_to_SVG/Adobe_Illustrator (2认同)

Kur*_*fle 81

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

inkscape \
  --without-gui \
  --file=input.pdf \
  --export-plain-svg=output.svg 
Run Code Online (Sandbox Code Playgroud)

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

  • 对于 inkscape 1.0.1(或更高版本),命令应为 `inkscape --export-type="svg" input.pdf` (7认同)
  • @MaxNoe:这很有可能——但这是内部构造特定 PDF 的方式的“属性”。有关从 PDF 中识别和提取“文本”的困难的一些解释,请参阅 [我在 GitHub 上手动编码的 PDF 文件(带有嵌入的评论)](https://github.com/angea/PDF101/tree/主/手工编码/文本提取)。*(在您选择的文本编辑器和 PDF 查看器中打开它们,然后从文件中复制“n”粘贴文本。)* (2认同)

pet*_*ust 21

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

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

更新:我现在已将其开发成PDF2SVG包,不再使用Batik:

已经在一系列PDF上测试过.它产生由SVG组成的SVG输出

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

以后的包将(希望)将字符转换为运行文本和更高级图形对象的路径

更新:我们现在可以从SVG字符重新创建运行文本.我们还将图表转换为特定于域的XML(例如化学光谱).请参阅https://bitbucket.org/petermr/svg2xml-dev.它仍然在Alpha中,但正在以有用的速度移动.任何人都可以加入!

UPDATE.(@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.


pie*_*rre 18

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

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

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

编辑:我的错误,这个工具也将字母转换为路径,因此它没有解决最初的问题.但无论如何它都做得很好,并且对于不打算修改svg文件中的代码的任何人都有用,所以我将留下帖子.

  • 在 Ubuntu 上,您可以使用以下命令安装它: $ sudo apt-get install pdf2svg (3认同)
  • 虽然它将字母转换为路径,但结果很好。为了进行一些修改,我曾经使用编辑器直接编辑 SVG。如果您使用inkscape将它们打开并保存为inkscape SVG,代码看起来会更好,并且您有对象ID,可以轻松找到要更改的实体。 (2认同)
  • 您可以使用“brew install pdf2svg”在 Mac 上安装它。 (2认同)

Cle*_*y85 9

这是我最终使用的过程.我使用的主要工具是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操作(以前称为批处理)创建自定义操作以将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"
    });
};
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

清理属性: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%"
Run Code Online (Sandbox Code Playgroud)

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引用

GhostScript引用了单独的页面

用于PDF到SVG转换的Inkscape命令行参考

Windows Cmd批处理文件脚本引用

XML标签/属性替换研究


dha*_*ann 7

如果DVI到SVG是一个选项,您还可以使用dvisvgm将DVI文件转换为SVG文件.这适用于LaTeX公式(带选项--no-fonts):

dvisvgm --no-fonts input.dvi -o output.svg
Run Code Online (Sandbox Code Playgroud)

还有pdf2svg使用poppler和Cairo将pdf转换为SVG.当我尝试这个时,SVG完美呈现inkscape.


Ala*_*ier 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
Run Code Online (Sandbox Code Playgroud)

要生成png,请使用--export-png,等等。


归档时间:

查看次数:

128767 次

最近记录:

7 年,3 月 前