Spire.XLS 16.4.2 已正式发布。该版本提升了 PDF 与 SVG 转换的稳定性,使导出结果更加可靠。同时,该版本还修复了一个重要问题,即透视表单元格中文本换行样式未能正确生效的问题。详情请阅读以下内容。
调整:
问题修复:
目录
在现代 Web 编辑器中,自定义字体对于提升视觉效果和优化用户体验至关重要。无论是构建企业级文档平台,还是在现有 Web 应用中集成在线编辑器,字体的选择都会直接影响内容的可读性、品牌一致性以及整体使用体验。
Spire.OfficeJS 是一款功能强大的浏览器端 Office 解决方案,支持开发者将 Word、Excel、PowerPoint 等文档编辑能力直接嵌入到 Web 应用中,无需依赖本地 Office 环境。它既支持通过产品包脚本进行直接部署,也可以集成到 React、Vue、Angular 等主流前端框架中使用。
在实际项目中,编辑器虽然内置了一些默认字体,但往往无法满足品牌定制或多语言场景的需求,因此通常需要引入自定义字体。基于这一点,本文将从两个方面进行讲解:一是如何通过产品包脚本添加自定义字体,二是如何在前端框架中完成字体集成,从而实现更加灵活、完整的应用方案。
如果你是直接使用产品包方式部署编辑器,那么添加字体的流程会相对简单。本部分将分别介绍在 Windows 和 Linux 系统中的操作方法。
首先,请确保你已经在本地下载了 Spire.OfficeJS 产品包。如果尚未下载,可以前往官方渠道获取并保存到本地,以便后续正常使用。
基于 Windows 的部署环境,可以按照以下步骤操作:
步骤 1:添加字体文件
将需要使用的字体文件复制到服务器目录下的 generateFonts\fonts 文件夹中。

步骤 2:运行字体生成脚本
返回到 OfficeJS 产品包目录,双击运行 run_genallfonts.bat 脚本。该脚本会将新字体注册到编辑器服务中,等待脚本执行完成即可。

步骤 3:刷新编辑器
脚本执行完成后,在浏览器中打开编辑器页面,并按下 Ctrl + F5 强制刷新。此时,新添加的字体就可以在编辑器中正常显示了。

在 Linux 环境下运行字体脚本前,需要先完成以下准备工作:
步骤 1:安装必要依赖
在执行字体生成脚本之前,请确保系统已安装所需依赖库,例如 libgdiplus 和 libicu。
步骤 2:添加字体文件
将自定义字体文件(如 .ttf 或 .otf)复制到部署服务器的指定目录:generateFonts/fonts。
步骤 3:执行字体生成脚本
运行 run_genallfonts.sh 脚本,在 Linux 环境中生成字体文件。

步骤 4:启动或刷新编辑器
脚本执行完成后,在浏览器中打开或刷新编辑器,即可查看新添加的字体。
对于使用 Vue、React 或 Angular 等现代前端框架的开发者,可以将生成好的字体直接集成到 Web 应用中。本教程以 React 为例进行说明。
你可以参考该教程开始在 React 项目中集成 Spire.OfficeJS:Spire.OfficeJS 接入 React 框架指南。
在 React 框架中集成字体的具体步骤如下:
步骤 1:生成字体文件
按照上文在 Windows 或 Linux 环境中的流程,先完成字体生成。
步骤 2:替换字体文件夹
找到生成字体所在目录 web/fontsweb,删除前端项目中原有的 fontsweb 文件夹,然后将新的 fontsweb 文件夹复制到项目目录中。
步骤 3:更新脚本文件
执行第一部分提到的 genallfonts.bat,然后将生成的 SupFonts.js(位于 web > service > spirecommon 目录下)复制到项目中,以确保编辑器能够识别新增字体。

步骤 4:更新字体缩略图
将 fonts_thumbnail.png 和 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 复制并替换到项目对应目录中。
![]()
步骤 5:刷新浏览器
启动 Web 应用并刷新页面,确认编辑器中已成功显示所有新添加的字体。
在为编辑器添加自定义字体后,建议遵循一些最佳实践,以确保在服务器端和前端环境中都能稳定运行。良好的文件管理和充分的验证,可以有效避免多字体场景或跨浏览器部署时出现的问题。
以下是常见问题及对应建议:
在 Spire.OfficeJS 中添加自定义字体,是提升 Web 编辑器视觉效果和使用体验的一个简单而高效的方法。无论是在 Windows / Linux 环境中通过脚本生成字体,还是在 React 等前端框架中进行集成,都可以帮助你打造更加统一、专业的编辑体验。
通过规范文件管理、进行跨浏览器测试以及谨慎处理字体资源,可以有效避免常见问题,确保系统稳定运行。现在就开始添加你的自定义字体,让编辑器拥有更灵活、更具品牌特色的排版能力。
如果你希望去除生成文档中的试用提示或解除功能限制,可以联系我们申请一个为期 30 天的临时许可证。
Spire.Presentation for Java 11.4.1 现已发布。该版本主要修复了添加 OLE 对象到 PowerPoint 文档,OLE 对象数据丢失的问题。详情请查看以下内容。
问题修复:
https://www.e-iceblue.cn/Downloads/Spire-Presentation-JAVA.html
我们很高兴宣布发布 Spire.XLS for Java 16.4.1。此更新通过解决转换过程中会生成多余页面的问题,增强了 Excel 转 PDF 功能。
问题修复:
Spire.PDF for Python 12.4.1 现已正式发布。该版本主要为 ReplaceText 接口新增了颜色参数重载。详情请查阅以下内容。
新功能:
textReplacer.ReplaceText("文档", "文件", Color.get_Blue())
Spire.Doc 14.4.9 现已正式发布。该版本在 CompareOptions 类中新增了多个接口,支持在对比文档时进行多维度配置。此外,为了保持命名一致性, CompareOptions.IgnoreTable 属性已重命名为 CompareOptions.IgnoreTables。更多详情如下。
调整:
新功能:
Document doc1 = new Document();
doc1.LoadFromFile(inputFile_1);
Document doc2 = new Document();
doc2.LoadFromFile(inputFile_2);
CompareOptions options = new CompareOptions();
options.CompareMoves = false;
options.IgnoreCaseChanges = false;
options.IgnoreComments = true;
options.IgnoreFields = true;
options.IgnoreFootnotes = true;
options.IgnoreTables = true;
options.IgnoreTextboxes = true;
doc1.Compare(doc2, "user", new DateTime(), options);
doc1.SaveToFile(outputFile, FileFormat.Docx2013);

在 .NET 文档处理工作流中,使用 C# 将 TIFF 转换为 PDF 是一项常见需求。开发人员经常需要将扫描文档或多页 TIFF 文件转换为 PDF 格式,以提升兼容性、简化分发流程并实现标准化的文档管理。
TIFF 文件在扫描和归档系统中应用广泛,尤其适合在单个文件中存储多个页面。然而,这种格式在共享或跨平台查看时并非总是理想选择,而 PDF 则可以提供更通用且一致的格式体验。
借助 Spire.PDF for .NET,您可以使用简洁可靠的 C# 代码高效地将 TIFF 图像转换为 PDF。本文将演示如何在 .NET 中执行 TIFF 到 PDF 的转换,包括处理多页 TIFF 图像、调整页面布局以及在实际场景中应用最佳实践。
文章目录:
TIFF(标记图像文件格式)是一种灵活的图像格式,支持在单个文件中包含多个页面。这一特性使其在以下场景中广受欢迎:
将 TIFF 转换为 PDF 具有以下优势:
本节提供使用 Spire.PDF 在 C# 中将 TIFF 图像转换为 PDF 的分步示例。
首先,通过 NuGet 包管理器安装库:
Install-Package FreeSpire.PDF
或使用 .NET CLI:
dotnet add package FreeSpire.PDF
您也可以下载 Spire.PDF for .NET 包并手动将其添加到项目中。
对于单页 TIFF 文件,最简单的方法是创建一个与原始图像尺寸匹配的 PDF 页面,并将图像直接绘制到页面上。这样可以确保 TIFF 内容完整填充整个 PDF 页面,避免出现不必要的边距或缩放问题。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
// 加载 TIFF 图像
PdfImage tiffImage = PdfImage.FromFile("Sample_Page.tiff");
// 创建新的 PDF 文档
PdfDocument pdf = new PdfDocument();
// 移除默认页面边距
pdf.PageSettings.Margins.All = 0;
// 获取图像尺寸
float width = tiffImage.PhysicalDimension.Width;
float height = tiffImage.PhysicalDimension.Height;
// 添加与 TIFF 图像相同大小的 PDF 页面
PdfPageBase page = pdf.Pages.Add(new SizeF(width, height));
// 绘制图像以完全填充页面
page.Canvas.DrawImage(tiffImage, 0, 0, width, height);
// 保存 PDF 文档
pdf.SaveToFile("Sample_Page.pdf");
pdf.Close();

关键 API 说明:
PdfImage.FromFile:将 TIFF 图像加载为 PDF 兼容对象PageSettings.Margins.All:移除默认边距以实现全页渲染Pages.Add(SizeF):创建与 TIFF 尺寸精确匹配的 PDF 页面Canvas.DrawImage:绘制 TIFF 图像以完全填充页面SaveToFile:保存转换后的 PDF 文件此方法保留了原始 TIFF 尺寸,确保输出的 PDF 在整个页面上清晰显示图像内容。
有关更多图像到 PDF 的转换场景,请参阅如何在 C# 中将图像转换为 PDF。
多页 TIFF 文件包含多个帧,每个帧代表一个独立的页面。在转换过程中,需要遍历每个帧并为当前 TIFF 帧创建尺寸匹配的 PDF 页面,以保留原始布局。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.Drawing.Imaging;
// 加载多页 TIFF 文件
Image tiffImage = Image.FromFile("Sample89.tiff");
// 获取帧信息
FrameDimension dimension = new FrameDimension(tiffImage.FrameDimensionsList[0]);
int frameCount = tiffImage.GetFrameCount(dimension);
// 创建新的 PDF 文档
PdfDocument pdf = new PdfDocument();
// 移除默认边距
pdf.PageSettings.Margins.All = 0;
// 处理每个 TIFF 帧
for (int i = 0; i < frameCount; i++)
{
// 选择当前帧
tiffImage.SelectActiveFrame(dimension, i);
// 将当前帧转换为 PdfImage
PdfImage pdfImage = PdfImage.FromImage(tiffImage);
// 获取当前帧尺寸
float width = pdfImage.PhysicalDimension.Width;
float height = pdfImage.PhysicalDimension.Height;
// 创建与帧大小匹配的 PDF 页面
PdfPageBase page = pdf.Pages.Add(new SizeF(width, height));
// 绘制帧以填充页面
page.Canvas.DrawImage(pdfImage, 0, 0, width, height);
}
// 保存 PDF 文档
pdf.SaveToFile("Sample89.pdf");
pdf.Close();
// 释放资源
tiffImage.Dispose();

核心概念解析:
FrameDimension:标识多页 TIFF 文件中的帧集合GetFrameCount:检索 TIFF 文件的总页数SelectActiveFrame:切换到指定的 TIFF 帧进行处理Pages.Add(SizeF):为每个 TIFF 页面创建尺寸匹配的 PDF 页面Canvas.DrawImage:将每个 TIFF 帧渲染到对应的 PDF 页面上此方法完整保留了原始 TIFF 文件中的所有页面,同时确保每个页面完全占据 PDF 画布,避免额外的边距或缩放失真。
在某些工作流中,输出的 PDF 必须遵循标准页面尺寸(如 A4 或 Letter),以便于打印、文档共享或归档。此时,可以按比例缩放图像以适配固定页面尺寸并保持水平居中,而非基于原始 TIFF 尺寸创建 PDF 页面。
using Spire.Pdf;
using Spire.Pdf.Graphics;
PdfDocument pdf = new PdfDocument();
PdfImage image = PdfImage.FromFile("Sample_Page.tiff");
// 创建带边距的 A4 页面
PdfPageBase page = pdf.Pages.Add(PdfPageSize.A4, new PdfMargins(20));
// 计算比例缩放
float scale = Math.Min(
page.Canvas.ClientSize.Width / image.PhysicalDimension.Width,
page.Canvas.ClientSize.Height / image.PhysicalDimension.Height
);
// 计算最终图像尺寸
float width = image.PhysicalDimension.Width * scale;
float height = image.PhysicalDimension.Height * scale;
// 水平居中并对齐顶部
float x = (page.Canvas.ClientSize.Width - width) / 2;
// 将图像绘制到 PDF 页面
page.Canvas.DrawImage(image, x, 0, width, height);
// 保存 PDF 文件
pdf.SaveToFile("Sample_Page_1.pdf");
pdf.Close();
生成的 PDF 将适配标准页面尺寸,同时保持原始图像的纵横比。

采用此方法的优势:
当需要让 TIFF 文件适配标准化的 PDF 布局而非保留其原始尺寸时,此方法尤为有效。
您还可以探索更多 C# 操作 PDF 布局和页面设置教程。
在生产环境中,通常需要对转换过程进行更精细的控制。
在文档管理系统、扫描档案或自动化工作流中,可能需要一次性将多个 TIFF 文件转换为 PDF 格式。以下示例处理文件夹中的所有 TIFF 文件,并将每个文件转换为单独的 PDF,同时保留原始图像尺寸。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;
string inputFolder = @"C:\Documents\TIFF";
string outputFolder = @"C:\Documents\PDF";
// 如果输出文件夹不存在则创建
Directory.CreateDirectory(outputFolder);
// 处理文件夹中的所有 TIFF 文件
foreach (string tiffFile in Directory.GetFiles(inputFolder, "*.tiff"))
{
PdfImage image = PdfImage.FromFile(tiffFile);
using (PdfDocument pdf = new PdfDocument())
{
// 创建与 TIFF 尺寸匹配的 PDF 页面
PdfPageBase page = pdf.Pages.Add(
new SizeF(
image.PhysicalDimension.Width,
image.PhysicalDimension.Height
)
);
// 将 TIFF 图像绘制到页面
page.Canvas.DrawImage(
image,
0,
0,
image.PhysicalDimension.Width,
image.PhysicalDimension.Height
);
// 生成输出文件路径
string outputFile = Path.Combine(
outputFolder,
Path.GetFileNameWithoutExtension(tiffFile) + ".pdf"
);
// 保存 PDF
pdf.SaveToFile(outputFile);
}
}
批量转换的优势:
此方法非常适合转换大量单页 TIFF 文件。如果文件夹中包含多页 TIFF 文档,可以将此方法与前面介绍的多页转换逻辑结合使用。
如果需要将多个 TIFF 图像合并为单个 PDF 文档,可以将每个 TIFF 文件添加为单独的 PDF 页面。这在整合扫描文档、发票或基于图像的报表时非常有用。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
string[] tiffFiles =
{
"Page1.tiff",
"Page2.tiff",
"Page3.tiff"
};
PdfDocument pdf = new PdfDocument();
foreach (string file in tiffFiles)
{
PdfImage image = PdfImage.FromFile(file);
float width = image.PhysicalDimension.Width;
float height = image.PhysicalDimension.Height;
// 创建与 TIFF 尺寸匹配的页面
PdfPageBase page = pdf.Pages.Add(new SizeF(width, height));
// 绘制 TIFF 图像
page.Canvas.DrawImage(image, 0, 0, width, height);
}
// 保存合并的 PDF
pdf.SaveToFile("CombinedDocument.pdf");
pdf.Close();
合并 TIFF 文件的好处:
当每个 TIFF 文件需要作为单独页面出现在单个 PDF 文档中时,此方法效果最佳。
如果您需要将多个转换后的 PDF 文件合并为一个文档,还可以查看如何在 C# 中合并 PDF 文件。
大型多页 TIFF 文件在转换过程中会消耗大量内存。为提高性能,建议按顺序处理每个帧并在使用后立即释放资源。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.Drawing.Imaging;
// 高效处理大型 TIFF 文件
using (Image tiffImage = Image.FromFile("LargeDocument.tiff"))
using (PdfDocument pdf = new PdfDocument())
{
FrameDimension dimension =
new FrameDimension(tiffImage.FrameDimensionsList[0]);
int frameCount = tiffImage.GetFrameCount(dimension);
for (int i = 0; i < frameCount; i++)
{
// 激活当前帧
tiffImage.SelectActiveFrame(dimension, i);
using (PdfImage image = PdfImage.FromImage(tiffImage))
{
float width = image.PhysicalDimension.Width;
float height = image.PhysicalDimension.Height;
// 创建与帧大小匹配的页面
PdfPageBase page = pdf.Pages.Add(
new SizeF(width, height)
);
// 绘制当前帧
page.Canvas.DrawImage(
image,
0,
0,
width,
height
);
}
}
pdf.SaveToFile("LargeDocument.pdf");
}
内存优化技巧:
using 语句自动释放资源此方法对于大型归档 TIFF 文件、医学扫描和企业文档迁移任务特别有用。
在将 TIFF 转换为 PDF 时,开发人员可能会遇到以下常见错误。
问题:PDF 输出中仅显示第一页。
原因:未正确迭代 TIFF 文件中的所有帧。
解决方案:使用 GetFrameCount 和 SelectActiveFrame 处理每个帧。
int frameCount = tiffImage.GetFrameCount(dimension);
for (int i = 0; i < frameCount; i++)
{
tiffImage.SelectActiveFrame(dimension, i);
// 处理每个帧
}
问题:图像出现拉伸或未正确适配 PDF 页面。
原因:将 TIFF 适配到固定尺寸页面(如 A4)时,缩放计算不正确。
解决方案:使用保持纵横比的比例缩放算法。
float scale = Math.Min(
page.Canvas.ClientSize.Width / image.PhysicalDimension.Width,
page.Canvas.ClientSize.Height / image.PhysicalDimension.Height
);
float width = image.PhysicalDimension.Width * scale;
float height = image.PhysicalDimension.Height * scale;
问题:处理大型 TIFF 文件时性能缓慢或出现内存不足错误。
原因:将多页 TIFF 加载到内存中而未及时释放资源。
解决方案:按顺序处理帧并及时释放资源。
using (Image tiffImage = Image.FromFile("Large.tiff"))
using (PdfDocument pdf = new PdfDocument())
{
// 逐个处理帧
}
问题:加载某些 TIFF 文件时出现错误。
原因:TIFF 文件使用了非标准压缩或颜色格式。
解决方案:确保 TIFF 文件使用库支持的标准格式。
使用 Spire.PDF for .NET 在 C# 中将 TIFF 转换为 PDF 是一个简洁高效的过程。该库提供了完善的方法来处理单页和多页 TIFF 文件,同时保持图像质量和布局准确性。
通过遵循本文中演示的示例和最佳实践,开发人员可以为各种场景实现可靠的 TIFF 到 PDF 转换,包括文档归档、批量处理和企业文档管理系统。
如果您想评估 Spire.PDF for .NET 的功能,可以申请免费试用许可证。
使用 FrameDimension 访问 TIFF 文件中的每个帧,然后为每个帧创建单独的 PDF 页面。GetFrameCount 方法返回帧的总数,SelectActiveFrame 允许您逐个处理每个帧。
使用专用库(如 Spire.PDF for .NET)提供最可靠和高效的解决方案。它以最少的代码处理图像加载和 PDF 生成,同时全面支持多页 TIFF 文件。
与未压缩的 TIFF 文件相比,PDF 压缩通常可以减小文件大小。但实际的大小缩减取决于原始 TIFF 压缩方式、图像内容和 PDF 设置。高分辨率图像仍可能导致较大的 PDF 文件。
可以。Spire.PDF for .NET 独立运行,不需要 Microsoft Office、Adobe Acrobat 或任何其他外部软件。它使用自身的渲染引擎执行所有转换操作。
要保留图像质量,应避免不必要的缩放,并将 PDF 页面尺寸与 TIFF 图像尺寸精确匹配以获得最佳效果。
我们很高兴地宣布发布 Spire.OCR for Python 2.1.0 版本。该版本实现了云端 AI 模型(包括豆包、通义千问和 DeepSeek)与 Spire.OCR for Python 的无缝集成。这些模型有助于提高图像中文字识别的准确性和增强识别效果。
新功能:
def _run_ai_test(self):
filename = "1.png"
output_file = "scan.txt"
file_path = r"F:\3.3.0AI\AI\ocr.xml"
model = "AIModel"
api_key = "ApiKey"
api_url = "ApiUrl"
self._update_ocr_config(file_path, model, api_key, api_url)
self._scan_img(filename, output_file)
def _scan_img(self, filename, output_file):
scanner = OcrScanner()
configure_options = ConfigureOptions()
configure_options.ModelPath = r"F:\3.3.0AI\AI"
configure_options.Language = "Japanese"
scanner.ConfigureDependencies(configure_options)
scanner.Scan(filename)
text = scanner.Text.ToString()
with open(output_file, "w", encoding="utf-8") as f:
f.write(text)
def _update_ocr_config(self, file_path, model, api_key, api_url):
tree = ET.parse(file_path)
root = tree.getroot()
model_node = root.find('./configs/model')
api_key_node = root.find('./configs/apiKey')
api_url_node = root.find('./configs/apiUrl')
if model_node is not None:
model_node.text = model
if api_key_node is not None:
api_key_node.text = api_key
if api_url_node is not None:
api_url_node.text = api_url
tree.write(file_path, encoding='utf-8', xml_declaration=True)
print("XML更新成功!")
Spire.Presentation 11.4.5 现已正式发布。该版本新增支持将 PPTX 文件保存为视频格式(.mp4/.wmv),同时修复了一些问题,例如 PowerPoint 转 PDF 时数据标签格式不正确,以及形状被裁切的问题。详情如下。
新功能:
注意:使用此功能需要指定 ffmpeg 路径。
Presentation ppt = new Presentation();
ppt.LoadFromFile(inputFile);
SaveToVideoOption saveOption = new SaveToVideoOption(ffmpegDir);
ppt.SaveToVideoOption=saveOption;// 默认每张幻灯片5秒
ppt.SaveToFile(outputFile_mp4, FileFormat.MP4);
ppt.SaveToFile(outputFile_wmv, FileFormat.WMV);
ppt.Dispose();
问题修复:
https://www.e-iceblue.cn/Downloads/Spire-Presentation-NET.html
Spire.OCR for Java 2.1.5 现已发布。该版本主要修复了一个授权识别失败的问题。详情请查看以下内容。
问题修复: