当前位置: 首页 > news >正文

PDF压缩

winnzip项目pdf压缩部分

/** * 压缩PDF文件 * @param inputFile 输入PDF文件路径 * @param outputFile 输出PDF文件路径 * @param compressionLevel 压缩等级: 0=小尺寸, 1=中等尺寸, 2=大尺寸 * @param lossless 是否无损压缩 * @return 压缩是否成功 */

使用Ghostscript命令行方式进行pdf压缩,这个东西自己找,开源的。

检查文件是否存在

static bool fileExists(const std::string& filePath) { DWORD const attr = GetFileAttributes(CommonTool::charToWchar(filePath).c_str()); return (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY)); }

如果文件属性有效并且不是一个目录即存在,返回验证结果。

构造gs命令

static std::string constructGSCommand(const std::string& inputFile, const std::string& outputFile, int compressionLevel, bool lossless) { std::string command = "gswin64c.exe -sDEVICE=pdfwrite \"-dCompatibilityLevel=1.4\" -dNOPAUSE -dBATCH -dQUIET"; // 根据压缩等级设置压缩参数 switch (compressionLevel) { case 0: // Small size command += " -dPDFSETTINGS=/screen -dEmbedAllFonts=true"; break; case 1: // Medium size command += " -dPDFSETTINGS=/ebook -dEmbedAllFonts=true"; break; case 2: command += " -dPDFSETTINGS=/printer"; break; default: command += " -dPDFSETTINGS=/default"; break; } // 如果是无损压缩,使用默认设置 if (lossless) { command += " -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode"; } command += " -sOutputFile=\"" + outputFile + "\" \"" + inputFile + "\""; spdlog::debug("Constructed gs command: {}", command); return command; }

参数输入文件,输出文件,压缩等级,是否无损压缩,根据参数进行字符串拼接。

执行命令行

static int executeCommand(const std::string& command) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); std::array<WCHAR, 1024> buffer{}; wcscpy_s(buffer.data(), buffer.size(), CommonTool::charToWchar(command).c_str()); // 创建不带窗口的进程 if (!CreateProcess(nullptr, buffer.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &si, &pi)) { spdlog::error("Failed to create process for command: {}", command); return -1; } // 等待进程结束 WaitForSingleObject(pi.hProcess, INFINITE); DWORD exit_code = 0; GetExitCodeProcess(pi.hProcess, &exit_code); // 关闭句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return static_cast<int>(exit_code); }

压缩PDF的主函数

static int compressPDF(const std::string& inputFile, const std::string& outputFile, int compressionLevel, bool lossless) { try { // 检查输入文件是否存在 if (!fileExists(inputFile)) { spdlog::error("Input file does not exist: {}", inputFile); return false; } std::string const command = constructGSCommand(inputFile, outputFile, compressionLevel, lossless); // 执行命令 int const result = executeCommand(command); return result; } catch (const std::exception& e) { spdlog::error("Exception during PDF compression: {}", e.what()); return -1; } }
http://www.cnnetsun.cn/news/137660.html

相关文章:

  • 基于最优指派策略的弹道导弹目标数据关联算法
  • 通达信主图MACD
  • Mistral 3 模型解析与部署实战:从 Large 3 到 Mini-stral
  • 2025网络安全学习路线 非常详细 推荐学习
  • 测试必知:线上出现BUG,该怎么办!
  • 【C++】学生管理系统设计与实现丨SQLite数据库版本
  • 第55集科立分板机:PCB激光分板机的效率如何
  • 28、UNIX 终端操作与测试实用指南
  • 31、UNIX实用技巧:ASCII表与经典编辑器使用指南
  • 三大限流算法:滑动窗口、令牌桶、漏桶
  • # 深入浅出 Flutter:构建跨平台应用的利器
  • 40、深入了解UNIX系统管理:职责与求职指南
  • stm32毕设本科生任务书指导
  • 效率神器!QuickTextPaste 便携版:快速文本粘贴 + 预设管理全攻略
  • 向量在计算机图形学中的核心应用
  • SelectDB索引实战:从入门到精通,避开那些年我踩过的坑
  • 探秘常见机器人控制运动上位机源码:解锁多种运动算法
  • 9 个降AI率工具,继续教育学生必备!
  • 运用工具Postman快速导出python接口测试脚本
  • 研发管理软件:合规・协同・智能・灵活为汽车部件行业研发管理强力赋能——全星研发管理APQP软件系统功能解析
  • EMS-NT企业微电网能碳管理平台:架构、功能与应用研究
  • 读捍卫隐私10读后总结与感想兼导读
  • OpenAI发布GPT-5.2系列;谷歌推出Gemini Deep Research API:AI领域的最新战况与未来前景
  • 华为云国际站代理商的AS跨境有什么优势呢?
  • NPP 草原:美国中部平原实验牧场(SGS),1939-1990 年,R1
  • CCD相机同步外触发拍照抓拍识别高速脉冲计数器信号采集模块
  • 【网络安全】2025新手如何上手挖漏洞(非常详细)零基础入门到精通,看这篇就够了!
  • BurpSuite渗透测试通关手册,简单几步带你从环境配置到报告生成
  • Python | OpenCV | 图像处理 | 入门实验 | 对比度增强 | 裁剪
  • Apifox:API 接口自动化测试完全指南