You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter项目中实现LaTeX转SVG并嵌入PDF?

Flutter中LaTeX公式转SVG并嵌入PDF的实现方案

一、离线优先方案(推荐)

1. 依赖库选择

使用以下Dart/Flutter包实现全离线流程:

  • tex_svg:本地将LaTeX数学公式转换为SVG字符串
  • pdf:生成PDF文档的核心库
  • pdf_svg:扩展pdf库以支持SVG嵌入

2. 步骤与代码示例

第一步:添加依赖到pubspec.yaml

dependencies:
  pdf: ^3.10.0
  tex_svg: ^0.1.0
  pdf_svg: ^1.0.0

第二步:核心实现代码

import 'package:tex_svg/tex_svg.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:pdf_svg/pdf_svg.dart';

/// 生成包含LaTeX公式的PDF文档
Future<pw.Document> generatePdfWithLatex(String latexMathFormula) async {
  // 1. 将LaTeX数学公式转换为SVG字符串
  final svgContent = await TeXSVG.convert(
    latexMathFormula,
    options: TeXSVGOptions(
      fontSize: 18,
      color: PdfColors.black,
      // 可根据需求调整公式对齐、边距等参数
    ),
  );

  // 2. 创建PDF文档并嵌入SVG
  final pdfDoc = pw.Document();
  pdfDoc.addPage(
    pw.Page(
      build: (context) => pw.Container(
        padding: pw.EdgeInsets.all(20),
        child: pw.SvgImage(svg: svgContent),
      ),
    ),
  );

  return pdfDoc;
}

// 使用示例:
// final pdf = await generatePdfWithLatex(r'E=mc^2');
// 后续可将pdf保存为文件或分享

3. 复杂公式的离线处理

如果tex_svg无法支持某些复杂LaTeX语法(如多行公式、特殊符号包),可改用将LaTeX渲染为图片再嵌入PDF的方案,基于flutter_math_fork实现:

import 'package:flutter/material.dart';
import 'package:flutter_math_fork/flutter_math.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'dart:ui' as ui;
import 'package:flutter_test/flutter_test.dart';

/// 将LaTeX公式转换为PDF可嵌入的图片
Future<pw.Image> latexToPdfImage(String latexFormula) async {
  final mathWidget = Math.tex(
    latexFormula,
    textStyle: TextStyle(fontSize: 20, color: Colors.black),
  );

  // 使用WidgetTester渲染Widget并转为图片
  final tester = await WidgetTester.pumpWidget(
    MaterialApp(home: Scaffold(body: Center(child: mathWidget))),
  );
  await tester.pumpAndSettle();

  final boundary = tester.firstWidget(find.byType(Math)) as Math;
  final renderObject = boundary.key?.currentContext?.findRenderObject() as ui.RenderRepaintBoundary?;
  final image = await renderObject?.toImage(pixelRatio: 3.0);
  final byteData = await image?.toByteData(format: ui.ImageByteFormat.png);
  final pngBytes = byteData?.buffer.asUint8List();

  return pw.Image(pw.MemoryImage(pngBytes!));
}

// 嵌入PDF的使用方式类似,将SvgImage替换为上述生成的pw.Image即可

二、备选在线方案(仅当离线库无法满足时使用)

若必须处理超复杂LaTeX语法,可通过HTTP请求将LaTeX转换为SVG(需网络),再嵌入PDF。核心逻辑是构造POST请求发送LaTeX代码,获取SVG后用pdf_svg嵌入,需自行处理请求与错误。

三、针对你已尝试方法的补充说明

  • tex包:需自行实现TeX到SVG的解析逻辑,效率低且易出问题,不如直接使用封装好的tex_svg
  • flutter_math/flutter_math_fork:虽不直接输出SVG,但可通过渲染为图片的方式间接实现PDF嵌入,适合离线场景
  • flutter_svg:仅负责SVG的渲染,需配合LaTeX转SVG的库使用,无法单独完成公式转换

内容的提问来源于stack exchange,提问作者Neeraj Ic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:38:14