如何在 C# 中将 PDF 转换为 SVG
IronPDF 中的 PdfToSvg 命名空间提供了一个专用的 API,用于将 PDF 页面转换为可缩放矢量图形。SVG(可缩放矢量图形)是一种基于 XML 的格式,在任何缩放级别下都保持清晰:与光栅图像(PNG、JPEG)不同,SVG 输出在放大时不会像素化。将 PDF 页面转换为 SVG 对于在网页中嵌入文档内容、生成分辨率无关的预览以及从报告、发票或技术图纸中提取矢量图形非常有用。
转换是按页面进行的:使用 PdfDocument.Open() 打开 PDF,通过 Pages 集合访问各个页面,然后在每个 PdfPage 上调用 SaveAsSvg() 或 ToSvgString() 以生成 SVG 输出。所有转换方法都有异步变体。
这是 PDF 到 SVG 的方向:从现有 PDF 文件中提取矢量 SVG。对于反向工作流(将 SVG 图形嵌入到新 PDF 中),请参阅 SVG 到 PDF 的操作指南。
开始免费 30 天试用以测试 PDF 到 SVG 的转换。
下面的示例打开一个 PDF 并将其第一页保存为 SVG 文件。
-
1Install IronPDF with NuGet Package Manager
-
2复制并运行这段代码。
using PdfToSvg; using var pdf = PdfDocument.Open("report.pdf"); pdf.Pages[0].SaveAsSvg("page-one.svg");Imports PdfToSvg Using pdf = PdfDocument.Open("report.pdf") pdf.Pages(0).SaveAsSvg("page-one.svg") End UsingImports PdfToSvg Using pdf = PdfDocument.Open("report.pdf") pdf.Pages(0).SaveAsSvg("page-one.svg") End Using -
3部署到您的生产环境中进行测试
通过免费试用立即在您的项目中开始使用IronPDF
最小工作流程(3 步)
- 通过 NuGet 安装 IronPDF:
Install-Package IronPdf - 使用
PdfToSvg命名空间中的PdfDocument.Open()打开 PDF - 在任何页面上调用
SaveAsSvg()以写入 SVG 文件
如何将单个 PDF 页面转换为 SVG?
PdfPage 类提供了四种转换方法:
SaveAsSvg():将页面写入文件路径或Stream。SaveAsSvgAsync():SaveAsSvg()的非阻塞变体。ToSvgString():返回 SVG 标记作为string,当输出用于模板引擎、HTTP 响应或下游管道时很有用。ToSvgStringAsync():ToSvgString()的非阻塞变体。
所有四种方法都接受一个可选的 SvgConversionOptions 参数和一个 CancellationToken。
下面的示例将第一页保存到文件中,将同一页面作为字符串返回,并将其写入流。它展示了所有三个输出目标。
using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
using var pdf = PdfDocument.Open("invoice.pdf");
// Save to a file
pdf.Pages[0].SaveAsSvg("invoice-page1.svg");
// Get SVG as a string
string svgMarkup = pdf.Pages[0].ToSvgString();
Console.WriteLine($"SVG length: {svgMarkup.Length} characters");
// Save to a stream
using var stream = new FileStream("invoice-page1-stream.svg", FileMode.Create);
pdf.Pages[0].SaveAsSvg(stream);using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
using var pdf = PdfDocument.Open("invoice.pdf");
// Save to a file
pdf.Pages[0].SaveAsSvg("invoice-page1.svg");
// Get SVG as a string
string svgMarkup = pdf.Pages[0].ToSvgString();
Console.WriteLine($"SVG length: {svgMarkup.Length} characters");
// Save to a stream
using var stream = new FileStream("invoice-page1-stream.svg", FileMode.Create);
pdf.Pages[0].SaveAsSvg(stream);Imports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Using pdf = PdfDocument.Open("invoice.pdf")
' Save to a file
pdf.Pages(0).SaveAsSvg("invoice-page1.svg")
' Get SVG as a string
Dim svgMarkup As String = pdf.Pages(0).ToSvgString()
Console.WriteLine($"SVG length: {svgMarkup.Length} characters")
' Save to a stream
Using stream As New FileStream("invoice-page1-stream.svg", FileMode.Create)
pdf.Pages(0).SaveAsSvg(stream)
End Using
End UsingImports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Using pdf = PdfDocument.Open("invoice.pdf")
' Save to a file
pdf.Pages(0).SaveAsSvg("invoice-page1.svg")
' Get SVG as a string
Dim svgMarkup As String = pdf.Pages(0).ToSvgString()
Console.WriteLine($"SVG length: {svgMarkup.Length} characters")
' Save to a stream
Using stream As New FileStream("invoice-page1-stream.svg", FileMode.Create)
pdf.Pages(0).SaveAsSvg(stream)
End Using
End UsingPdfDocument 实现了 IDisposable,因此将其包装在 using 语句中可以在转换完成后释放本机资源。Pages 集合是从零开始索引的,因此 Pages[0] 是第一页。
PdfToSvg.PdfDocument 是与 IronPdf.PdfDocument 不同的类;using PdfToSvg; 指令将其引入作用域。何时选择 PDF 到 SVG?
当页面需要缩放、嵌入网页布局或在转换后重新设计时,SVG 是更好的输出选择:文本保持可选择和可搜索,路径在矢量工具中保持可编辑。对于扫描或摄影页面,没有矢量内容需要保留,因此光栅导出更小且不会丢失任何内容。
如何将 PDF 中的所有页面转换为 SVG?
Pages 集合是从零开始索引的,因此在循环索引中加一可以为每个输出文件提供人类可读的页码。
using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
using var pdf = PdfDocument.Open("multi-page-report.pdf");
Console.WriteLine($"Total pages: {pdf.Pages.Count}");
for (int i = 0; i < pdf.Pages.Count; i++)
{
var page = pdf.Pages[i];
string outputPath = $"page_{i + 1}.svg";
page.SaveAsSvg(outputPath);
Console.WriteLine($"Saved: {outputPath}");
}using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
using var pdf = PdfDocument.Open("multi-page-report.pdf");
Console.WriteLine($"Total pages: {pdf.Pages.Count}");
for (int i = 0; i < pdf.Pages.Count; i++)
{
var page = pdf.Pages[i];
string outputPath = $"page_{i + 1}.svg";
page.SaveAsSvg(outputPath);
Console.WriteLine($"Saved: {outputPath}");
}Imports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Using pdf = PdfDocument.Open("multi-page-report.pdf")
Console.WriteLine($"Total pages: {pdf.Pages.Count}")
For i As Integer = 0 To pdf.Pages.Count - 1
Dim page = pdf.Pages(i)
Dim outputPath As String = $"page_{i + 1}.svg"
page.SaveAsSvg(outputPath)
Console.WriteLine($"Saved: {outputPath}")
Next
End UsingImports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Using pdf = PdfDocument.Open("multi-page-report.pdf")
Console.WriteLine($"Total pages: {pdf.Pages.Count}")
For i As Integer = 0 To pdf.Pages.Count - 1
Dim page = pdf.Pages(i)
Dim outputPath As String = $"page_{i + 1}.svg"
page.SaveAsSvg(outputPath)
Console.WriteLine($"Saved: {outputPath}")
Next
End Using对于大型文档,下一节中描述的异步方法可以避免在转换期间阻塞应用程序线程。
如何使用异步方法进行 PDF 到 SVG 转换?
异步变体 SaveAsSvgAsync() 和 ToSvgStringAsync() 将 I/O 保持在主线程之外。PdfDocument.OpenAsync() 也可以异步加载 PDF。这些方法在 ASP.NET Core 处理程序、后台服务或任何具有响应式 UI 的应用程序中是正确的选择。
下面的示例异步打开 PDF 并转换每个页面,因此调用线程在工作运行时保持空闲。
using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
using var pdf = await PdfDocument.OpenAsync("dashboard.pdf");
for (int i = 0; i < pdf.Pages.Count; i++)
{
var page = pdf.Pages[i];
await page.SaveAsSvgAsync($"dashboard_page_{i + 1}.svg");
}
// Or get the SVG markup as a string
string firstPageSvg = await pdf.Pages[0].ToSvgStringAsync();using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
using var pdf = await PdfDocument.OpenAsync("dashboard.pdf");
for (int i = 0; i < pdf.Pages.Count; i++)
{
var page = pdf.Pages[i];
await page.SaveAsSvgAsync($"dashboard_page_{i + 1}.svg");
}
// Or get the SVG markup as a string
string firstPageSvg = await pdf.Pages[0].ToSvgStringAsync();Imports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Using pdf = Await PdfDocument.OpenAsync("dashboard.pdf")
For i As Integer = 0 To pdf.Pages.Count - 1
Dim page = pdf.Pages(i)
Await page.SaveAsSvgAsync($"dashboard_page_{i + 1}.svg")
Next
' Or get the SVG markup as a string
Dim firstPageSvg As String = Await pdf.Pages(0).ToSvgStringAsync()
End UsingImports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Using pdf = Await PdfDocument.OpenAsync("dashboard.pdf")
For i As Integer = 0 To pdf.Pages.Count - 1
Dim page = pdf.Pages(i)
Await page.SaveAsSvgAsync($"dashboard_page_{i + 1}.svg")
Next
' Or get the SVG markup as a string
Dim firstPageSvg As String = Await pdf.Pages(0).ToSvgStringAsync()
End Using如何配置 SVG 转换选项?
SvgConversionOptions 控制 SVG 输出的生成方式。最常用的属性是:
IncludeAnnotations:设置为true以在 SVG 输出中渲染 PDF 注释层IncludeLinks:设置为true以将 PDF 超链接作为<a>元素传递到 SVG 中,使输出在浏览器中可导航IncludeHiddenText:显示存在于 PDF 内容流中但不可见的文本,对于可访问性或文本提取管道很有用MinStrokeWidth:设置渲染笔划的最小值(以 SVG 用户单位),防止细线路径在正常查看比例下消失
下面的代码打开注释和链接,设置最小笔划宽度,然后使用这些选项导出每个页面。
using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
var options = new SvgConversionOptions
{
IncludeAnnotations = true,
IncludeLinks = true,
IncludeHiddenText = false,
MinStrokeWidth = 0.5
};
using var pdf = PdfDocument.Open("annotated-report.pdf");
for (int i = 0; i < pdf.Pages.Count; i++)
{
var page = pdf.Pages[i];
page.SaveAsSvg($"page_{i + 1}.svg", options);
}using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
var options = new SvgConversionOptions
{
IncludeAnnotations = true,
IncludeLinks = true,
IncludeHiddenText = false,
MinStrokeWidth = 0.5
};
using var pdf = PdfDocument.Open("annotated-report.pdf");
for (int i = 0; i < pdf.Pages.Count; i++)
{
var page = pdf.Pages[i];
page.SaveAsSvg($"page_{i + 1}.svg", options);
}Imports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Dim options = New SvgConversionOptions With {
.IncludeAnnotations = True,
.IncludeLinks = True,
.IncludeHiddenText = False,
.MinStrokeWidth = 0.5
}
Using pdf = PdfDocument.Open("annotated-report.pdf")
For i As Integer = 0 To pdf.Pages.Count - 1
Dim page = pdf.Pages(i)
page.SaveAsSvg($"page_{i + 1}.svg", options)
Next
End UsingImports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Dim options = New SvgConversionOptions With {
.IncludeAnnotations = True,
.IncludeLinks = True,
.IncludeHiddenText = False,
.MinStrokeWidth = 0.5
}
Using pdf = PdfDocument.Open("annotated-report.pdf")
For i As Integer = 0 To pdf.Pages.Count - 1
Dim page = pdf.Pages(i)
page.SaveAsSvg($"page_{i + 1}.svg", options)
Next
End Using另外两个属性控制文本间距的处理方式。CollapseSpaceEmbeddedFont 和 CollapseSpaceLocalFont 设置阈值(作为字体大小的分数),低于该阈值时相邻字符之间的间隙会折叠为单个文本运行。更紧的值保留更多的间距保真度;更松的值生成更小的 SVG 文件。
对于高级用例,FontResolver 属性接受一个自定义解析器,该解析器将 PDF 字体引用映射到本地字体资源,当源文档引用未嵌入的字体时,这一点至关重要。ImageResolver 属性控制 PDF 中的光栅图像在 SVG 输出中的处理方式:内联编码生成一个自包含的 SVG 文件,而外部路径解析保持 SVG 紧凑。SvgConversionOptions API 参考 记录了每个可配置属性。
如何控制 SVG 输出中的 PDF 图层可见性?
分层 PDF 通过 PdfDocument 上的 OptionalContentGroups 集合公开其图层。每个条目都是一个 OptionalContentGroup,它将一个只读的 Name(源文档中的图层标签)与一个 get/set Visible 标志配对。设置 Visible 控制该图层在 SVG 转换期间是否呈现,因此单个 PDF 可以在不编辑文件的情况下生成不同的 SVG 变体。
您无需提前知道图层名称。集合反映了文档中实际存在的图层,因此您可以枚举它,读取每个 Name,并关闭您想要隐藏的图层。ToString() 返回与 Name 相同的值,这对于日志记录很方便。
下面的示例列出了 PDF 中的每个图层,隐藏名为 Watermark 的图层,并在该图层被抑制的情况下导出第一页。
using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
using var pdf = PdfDocument.Open("technical-drawing.pdf");
// List the layers that actually exist in this PDF
foreach (var layer in pdf.OptionalContentGroups)
{
Console.WriteLine($"{layer.Name} visible: {layer.Visible}");
}
// Hide the watermark layer; every other layer stays visible
foreach (var layer in pdf.OptionalContentGroups)
{
if (layer.Name == "Watermark")
{
layer.Visible = false;
}
}
// Visibility set on OptionalContentGroups is applied during conversion
pdf.Pages[0].SaveAsSvg("drawing-no-watermark.svg");using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
using var pdf = PdfDocument.Open("technical-drawing.pdf");
// List the layers that actually exist in this PDF
foreach (var layer in pdf.OptionalContentGroups)
{
Console.WriteLine($"{layer.Name} visible: {layer.Visible}");
}
// Hide the watermark layer; every other layer stays visible
foreach (var layer in pdf.OptionalContentGroups)
{
if (layer.Name == "Watermark")
{
layer.Visible = false;
}
}
// Visibility set on OptionalContentGroups is applied during conversion
pdf.Pages[0].SaveAsSvg("drawing-no-watermark.svg");Imports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Using pdf = PdfDocument.Open("technical-drawing.pdf")
' List the layers that actually exist in this PDF
For Each layer In pdf.OptionalContentGroups
Console.WriteLine($"{layer.Name} visible: {layer.Visible}")
Next
' Hide the watermark layer; every other layer stays visible
For Each layer In pdf.OptionalContentGroups
If layer.Name = "Watermark" Then
layer.Visible = False
End If
Next
' Visibility set on OptionalContentGroups is applied during conversion
pdf.Pages(0).SaveAsSvg("drawing-no-watermark.svg")
End UsingImports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
Using pdf = PdfDocument.Open("technical-drawing.pdf")
' List the layers that actually exist in this PDF
For Each layer In pdf.OptionalContentGroups
Console.WriteLine($"{layer.Name} visible: {layer.Visible}")
Next
' Hide the watermark layer; every other layer stays visible
For Each layer In pdf.OptionalContentGroups
If layer.Name = "Watermark" Then
layer.Visible = False
End If
Next
' Visibility set on OptionalContentGroups is applied during conversion
pdf.Pages(0).SaveAsSvg("drawing-no-watermark.svg")
End Using一个典型的用例是技术图纸,其中注释、尺寸或水印图层需要独立切换。由于可见性是按转换设置的,因此相同的源 PDF 可以在不更改文件的情况下生成多个 SVG 变体。
如何从流中打开 PDF 并使用密码?
PdfDocument.Open() 除了接受文件路径外,还接受 Stream。leaveOpen 参数(默认值为 false)控制在文档被释放时流是否关闭。路径和流重载都接受一个 OpenOptions 对象,用于配置加密文档的密码提供,以及长时间运行工作流中的协作取消的 CancellationToken。
代码片段从流中打开 PDF,将其第一页保存为 SVG,然后打印文件是否加密、其标题及其页数。
using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
// Open from a stream (e.g., downloaded from a web API)
using var fileStream = File.OpenRead("document.pdf");
using var pdf = PdfDocument.Open(fileStream, leaveOpen: false);
pdf.Pages[0].SaveAsSvg("from-stream.svg");
// Check if a PDF is encrypted
Console.WriteLine($"Encrypted: {pdf.IsEncrypted}");
// Access document metadata
Console.WriteLine($"Title: {pdf.Info.Title}");
Console.WriteLine($"Pages: {pdf.Pages.Count}");using PdfToSvg;
using PdfDocument = PdfToSvg.PdfDocument;
// Open from a stream (e.g., downloaded from a web API)
using var fileStream = File.OpenRead("document.pdf");
using var pdf = PdfDocument.Open(fileStream, leaveOpen: false);
pdf.Pages[0].SaveAsSvg("from-stream.svg");
// Check if a PDF is encrypted
Console.WriteLine($"Encrypted: {pdf.IsEncrypted}");
// Access document metadata
Console.WriteLine($"Title: {pdf.Info.Title}");
Console.WriteLine($"Pages: {pdf.Pages.Count}");Imports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
' Open from a stream (e.g., downloaded from a web API)
Using fileStream = File.OpenRead("document.pdf")
Using pdf = PdfDocument.Open(fileStream, leaveOpen:=False)
pdf.Pages(0).SaveAsSvg("from-stream.svg")
' Check if a PDF is encrypted
Console.WriteLine($"Encrypted: {pdf.IsEncrypted}")
' Access document metadata
Console.WriteLine($"Title: {pdf.Info.Title}")
Console.WriteLine($"Pages: {pdf.Pages.Count}")
End Using
End UsingImports PdfToSvg
Imports PdfDocument = PdfToSvg.PdfDocument
' Open from a stream (e.g., downloaded from a web API)
Using fileStream = File.OpenRead("document.pdf")
Using pdf = PdfDocument.Open(fileStream, leaveOpen:=False)
pdf.Pages(0).SaveAsSvg("from-stream.svg")
' Check if a PDF is encrypted
Console.WriteLine($"Encrypted: {pdf.IsEncrypted}")
' Access document metadata
Console.WriteLine($"Title: {pdf.Info.Title}")
Console.WriteLine($"Pages: {pdf.Pages.Count}")
End Using
End UsingInfo 属性公开了文档元数据,包括标题、作者和创建日期。Permissions 属性报告 PDF 允许的操作(打印、复制),而 IsEncrypted 指示文件是否需要密码才能打开。
下一步
PdfToSvg 命名空间将 PDF 页面转换为 SVG 文件、流或字符串。它按页面工作,完全控制注释、链接、文本可见性、笔划宽度和图层切换。所有方法都有异步变体以实现非阻塞工作流。
探索 PdfPage API 参考 以获取完整的转换方法界面,SvgConversionOptions 参考 以获取每个可配置属性,以及 PdfDocument 参考 以获取打开和加载选项。对于反向方向(将 SVG 嵌入到 PDF 中),请参阅 SVG 到 PDF 的操作指南。
查看许可选项,起价为 $999。
常见问题解答
将 PDF 文件转换为 SVG 格式的目的是什么?
将 PDF 文件转换为 SVG 格式可以将文档内容嵌入网页中,生成分辨率无关的预览,并从报告、发票或技术图纸中提取矢量图形。SVG 是可缩放的,不会像素化,非常适合用于网页和设计应用。
如何利用 IronPDF 的 PdfToSvg 进行 PDF 到 SVG 的转换?
IronPDF 的 PdfToSvg 命名空间提供了一个专用 API,用于将 PDF 页面转换为 SVG 格式。您可以使用 PdfDocument.Open() 打开 PDF,通过 Pages 集合访问各个页面,然后在每个 PdfPage 上调用 SaveAsSvg() 或 ToSvgString() 以生成 SVG 输出。
PDF 页面可以使用 IronPDF 异步转换为 SVG 吗?
是的,IronPDF 支持异步 PDF 到 SVG 转换。您可以使用 SaveAsSvgAsync() 和 ToSvgStringAsync() 方法将 I/O 操作保持在主线程之外,这在响应式应用程序中非常有用。
IronPDF 中的 SvgConversionOptions 是什么?
IronPDF 中的 SvgConversionOptions 控制 SVG 输出的生成方式。选项包括是否在输出中包含注释、链接和隐藏文本,以及设置最小笔画宽度。这些选项允许自定义 SVG 转换过程。
使用 IronPDF 将 PDF 转换为 SVG 时可以控制图层可见性吗?
是的,IronPDF 允许使用 PdfDocument 上的 OptionalContentGroups 集合来控制 PDF 图层的可见性。您可以切换特定图层的可见性,这决定了它们在 SVG 转换期间是否被渲染。
IronPDF 如何处理加密的 PDF 文件以进行 SVG 转换?
IronPDF 可以使用 OpenOptions 对象打开加密的 PDF 文件,其中包括提供密码。这允许加密的 PDF 在身份验证后转换为 SVG。
在 Web 应用程序中使用 SVG 格式的 PDF 有哪些好处?
SVG 格式对 Web 应用程序有益,因为它保持高质量、可缩放的图形而不会像素化,支持可选择和可搜索的文本,并允许使用 CSS 或脚本进行样式修改。
IronPDF 可以将 PDF 的所有页面转换为单独的 SVG 文件吗?
是的,IronPDF 可以将 PDF 的所有页面转换为单独的 SVG 文件。通过遍历 Pages 集合,您可以将每个页面保存为单独的 SVG 文件,这对于多页 PDF 很有用。
使用 IronPDF 开始将 PDF 转换为 SVG 的最小步骤是什么?
要使用 IronPDF 将 PDF 转换为 SVG,您需要通过 NuGet 安装 IronPDF,从 PdfToSvg 命名空间使用 PdfDocument.Open() 打开 PDF,并在任何页面上调用 SaveAsSvg() 以写入 SVG 文件。
IronPDF 是否支持从流中打开 PDF 以进行转换?
是的,IronPDF 支持从流中打开 PDF。您可以使用 PdfDocument.Open() 和 Stream 输入,这使得它在 PDF 不是作为文件存储而是从其他来源流式传输的情况下非常通用。
Ahmad 是一名全栈开发人员,拥有扎实的 C#、Python 和 Web 技术基础。他对构建可扩展的软件解决方案深感兴趣,并喜欢探索设计和功能在实际应用中如何结合。