将 PDF 转换为干净的 SVG? [关闭]

Posted

技术标签:

【中文标题】将 PDF 转换为干净的 SVG? [关闭]【英文标题】:Convert PDF to clean SVG? [closed] 【发布时间】:2012-05-04 12:12:19 【问题描述】:

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

我想知道最干净的 PDF 到 SVG 转换器是什么,希望它没有路径,它的文本区域根本不需要。我们知道,PDF 和 SVG 非常相似,所以我认为那里有一些不错的转换器。

【问题讨论】:

PDF 和 SVG 是相似的,因为它们都是基于矢量的格式。我相信这就是比较结束的地方。 我想他们都使用了大量的文本绝对定位。 【参考方案1】:

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

inkscape \
  --without-gui \
  --file=input.pdf \
  --export-plain-svg=output.svg 

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

【讨论】:

这会为我删除文本中的空格。 @MaxNoe:这很有可能——但这是内部构造特定 PDF 的方式的“属性”。有关从 PDF 中识别和提取“文本”时遇到的困难的一些解释,请参阅my hand-coded PDF files (with the embedded comments) at GitHub。 (在您选择的文本编辑器以及 PDF 查看器中打开它们,然后从文件中复制“n”粘贴文本。) 是的,我认为这与 tex 将空格呈现为框的方式有关。 --without-gui 至少在 inkscape 1.0.1 中已被弃用 对于 inkscape 1.0.1(或更高版本),命令应为 inkscape --export-type="svg" input.pdf【参考方案2】:

Wikipedia 上的许多人使用 Inkscape 将 PDF 转换为 SVG。

http://inkscape.org/

他们甚至有一个方便的指南!

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

【讨论】:

Inkscape 不能很好地工作,因为它也会将文本更改为路径。我还发现它们经常丢失字体数据,但似乎并不近似于安装好的字体。如果SVG不能,PDF如何显示? 这是一个公平的问题,我对这两种格式都很熟悉,但我没有对该主题进行大量研究。我可能会调查一下。它认为这可能归结为两种格式的构建方式。例如 SVG 是用 XML 构建的,而 PDF 使用它自己的 XML 类型格式。 嗯,我想要这个的原因是因为我希望能够使用 php 编辑文本。我可以直接用 PDF 来做,但 PDF 不能轻易地内联到 html,但 SVG 可以。我可能只是坚持使用 PDF 并在编辑它的值后将其转换为 PHP 中的 JPG .. @DanRedux: AFAIK,你可以在 Inkscape 中关闭 'font texts to paths' 转换。在 Inkscape 命令行中,您可以通过添加 --export-text-to-path启用此转换。 这可能很明显,但 Illustrator 可以将 PDF 转换为 SVG。来到这里,下载了 Inkscape 然后意识到我有 Illustrator。 en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…【参考方案3】:

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

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

更新: 我现在已将其开发为不再使用蜡染的package 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/imageanalysishttps://bitbucket.org/petermr/diagramanalyzerhttps://bitbucket.org/petermr/norma 和https://bitbucket.org/petermr/ami-core 。这是一个资助项目,旨在从科学文献 (contentmine.org) 中获取 1 亿个事实,其中大部分是 PDF。

【讨论】:

该代码是否已从 Bitbucket 转移到其他地方? 变化很大。见github.com/petermr/ami3【参考方案4】:

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

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

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

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

【讨论】:

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

这是我最终使用的过程。我使用的主要工具是 Inkscape,它能够很好地转换文本。

使用带有 javascript 的 Adob​​e Acrobat Pro 操作来拆分 PDF 工作表 从 Windows Cmd 运行 Inkscape Portable 0.48.5 以转换为 SVG 对使用 Windows Cmd 和 Windows PowerShell 时遇到问题的特定 SVG XML 属性进行了一些手动编辑

单独的页面:带有 JavaScript 的 Adob​​e Acrobat Pro

使用 Adob​​e 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 引用

How to automate extracting pages from a PDF... JavaScript for Acrobat API Reference - extractPages Extract pages to separate pdfs (something wrong with loop?) How can I create a Zerofilled value using JavaScript? How to output integers with leading zeros in JavaScript

对单独页面的 GhostScript 引用

GhostScript noob help - Breaking a multipage PDF file... How to convert a multi-page PDF file... Splitting a PDF with Ghostscript

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

convert pdf to svg Convert PDF to clean SVG?

Windows Cmd 批处理文件脚本参考

Hidden features of Windows batch files SS64.com - Index of the Windows CMD command line Why is the FOR /f loop in this batch script evaluating a blank line?

XML标签/属性替换研究

How can you find and replace text in a file using the Windows command-line environment? Changing tag data in an XML file using windows batch file update XML from the command line [windows] How to modify/create values in XML files using PowerShell? Editing XML Attributes using Powershell powershell change the value of XML Element attribute

【讨论】:

谢谢。我修改了你的命令行并使用for /l %i in (1,1,58) Do @%inkscape% --pdf-page %i ... 来分隔页面并直接在svg 中转换它们【参考方案6】:

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

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

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

【讨论】:

我有一个 PDF,它呈现了 skak 包(棋子)中的一些 LaTeX 符号。这个特定的文件在 Inkscape 中没有得到很好的处理,因为符号变成了 Arial 字母......我用 pdf2svg 得到了正确的结果。 对于 Windows 系统,这里有一组编译的二进制工具:Poppler for Windows。【参考方案7】:

将 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 等...

【讨论】:

【参考方案8】:

我发现xfig 做得很好:

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

export to svg

它比inkscape 做得更好。实际上可能是 pdtoedit 做到了。

【讨论】:

【参考方案9】:

这是两个 PDF 渲染脚本的 NodeJS REST api。 https://github.com/pumppi/pdf2images

脚本是:pdf2svg 和 Imagemagicks 转换

【讨论】:

以上是关于将 PDF 转换为干净的 SVG? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将pdf转换为svg

如何将wmf文件转换为svg文件

扁平化 SVG 嵌套转换的工具 [关闭]

将 svg 转换为图像的库? [关闭]

如何将 PNG 图像转换为 SVG? [关闭]

使用 C# 将 SVG 转换为 PNG [关闭]