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

Flutter Desktop项目中如何添加C++包Aspose.PDF?

在Flutter Desktop项目中集成Aspose.PDF for C++实现PDF打印

一、准备Aspose.PDF for C++资源

  • 下载对应版本的Aspose.PDF for C++包(需匹配你的Visual Studio版本和项目架构,比如VS2022 + x64)
  • 解压后得到核心目录:include(头文件)、lib(分Debug/Release的库文件)、bin(依赖DLL)

二、配置Visual Studio中的Flutter Windows项目

打开Flutter项目的Windows工程(路径:项目根目录/windows/Runner.sln),对Runner项目做以下配置:

  1. 添加头文件路径:右键Runner → 属性 → 配置属性 → C/C++ → 常规 → 附加包含目录,添加Aspose.PDF解压后的include文件夹绝对路径
  2. 添加库文件路径:右键Runner → 属性 → 配置属性 → 链接器 → 常规 → 附加库目录,添加对应配置的lib路径(比如Debug模式加lib/x64/Debug,Release模式加lib/x64/Release)
  3. 添加依赖库:右键Runner → 属性 → 配置属性 → 链接器 → 输入 → 附加依赖项,添加Aspose.PDF.lib(注意Debug版可能为Aspose.PDFd.lib,以解压后的lib文件名为准)
  4. 复制依赖DLL:将Aspose.PDF解压后bin/x64/对应配置下的Aspose.PDF.dll复制到Flutter项目的windows/Runner/对应配置目录(比如Debug模式复制到windows/Runner/Debug);也可通过VS后期生成事件自动复制,命令示例:
    xcopy /Y "D:\Aspose.PDF_CPP\bin\x64\$(Configuration)\Aspose.PDF.dll" "$(OutDir)"
    

三、编写C++打印逻辑与Flutter通道

  1. 创建打印工具类文件:在windows/Runner目录下新建pdf_printer.h和pdf_printer.cpp
    • pdf_printer.h内容:
      #pragma once
      #include <flutter/method_channel.h>
      #include <flutter/plugin_registrar_windows.h>
      
      namespace pdf_printer {
          void RegisterWithRegistrar(flutter::PluginRegistrarWindows* registrar);
      }
      
    • pdf_printer.cpp内容:
      #include "pdf_printer.h"
      #include <Aspose.PDF.h>
      #include <flutter/method_result_functions.h>
      
      using namespace Aspose::Pdf;
      using namespace flutter;
      
      namespace pdf_printer {
          void HandlePrintPdf(const MethodCall<EncodableValue>& call, std::unique_ptr<MethodResult<EncodableValue>> result) {
              // 校验参数
              if (!call.arguments()) {
                  result->Error("INVALID_ARGUMENT", "未提供PDF路径");
                  return;
              }
              const auto& args = std::get<EncodableMap>(*call.arguments());
              auto path_it = args.find(EncodableValue("path"));
              if (path_it == args.end()) {
                  result->Error("INVALID_ARGUMENT", "缺少PDF路径参数");
                  return;
              }
              std::string pdf_path = std::get<std::string>(path_it->second);
              
              try {
                  // 加载PDF并打印
                  auto document = MakeObject<Document>(pdf_path);
                  document->Print();
                  result->Success(EncodableValue(true));
              } catch (const Exception& ex) {
                  result->Error("PRINT_FAILED", ex->get_Message().ToUtf8String());
              } catch (...) {
                  result->Error("PRINT_FAILED", "打印PDF时发生未知错误");
              }
          }
      
          void RegisterWithRegistrar(PluginRegistrarWindows* registrar) {
              auto channel = std::make_unique<MethodChannel<EncodableValue>>(
                  registrar->messenger(), "pdf_printer",
                  &StandardMethodCodec::GetInstance());
      
              channel->SetMethodCallHandler(
                  [](const auto& call, auto result) {
                      if (call.method_name() == "printPdf") {
                          HandlePrintPdf(call, std::move(result));
                      } else {
                          result->NotImplemented();
                      }
                  });
      
              registrar->AddPlugin(std::make_unique<flutter::Plugin>());
          }
      }
      
  2. 注册通道到Flutter:修改windows/Runner/runner.cpp,添加头文件引用#include "pdf_printer.h",并在RegisterPlugins函数中加入:
    pdf_printer::RegisterWithRegistrar(registrar);
    

四、Flutter端调用原生打印方法

创建Flutter端的通道调用工具类:

import 'package:flutter/services.dart';

class PdfPrinter {
  static const MethodChannel _channel = MethodChannel('pdf_printer');

  /// 调用原生打印PDF
  /// [path]:PDF文件的绝对路径
  static Future<bool> printPdf(String path) async {
    try {
      final bool result = await _channel.invokeMethod('printPdf', {'path': path});
      return result;
    } on PlatformException catch (e) {
      throw Exception('打印失败:${e.message}');
    }
  }
}

在需要打印的页面直接调用:

// 示例:打印指定路径的PDF
try {
  await PdfPrinter.printPdf('C:/test.pdf');
} catch (e) {
  print(e.toString());
}

五、关键注意事项

  • 版本匹配:确保Aspose.PDF的版本与你的VS版本、项目架构(x64)完全匹配,否则会出现链接或运行错误
  • 许可证:Aspose.PDF试用版打印会有水印,正式使用需购买许可证,可在C++代码中添加授权:
    auto license = MakeObject<License>();
    license->SetLicense("你的许可证文件路径");
    
  • 配置一致性:调试或打包时,要保持VS配置(Debug/Release)与Flutter运行配置一致,避免DLL不匹配问题

内容的提问来源于stack exchange,提问作者adel kutait

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:17:21