news 2026/2/12 5:57:25

PDF压缩

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/11 14:05:19

国产自主芯片加持!光润通FF-904E-V3.0千兆四光口网卡深度解析与应用场景

在企业级网络、数据中心建设中&#xff0c;网卡作为数据传输的核心枢纽&#xff0c;其性能、稳定性与自主可控性直接决定了整个网络架构的可靠性与安全性。近年来&#xff0c;国产网络硬件崛起&#xff0c;越来越多的企业开始选择自主研发的网络设备。今天就为大家深度解析一款…

作者头像 李华
网站建设 2026/2/11 14:05:17

【开题答辩过程】以《基于python的气象灾害数据分析与可视化系统》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看

个人简介慕婉学姐精通Java、PHP、微信小程序、Python、Golang和安卓开发等语言&#xff0c;擅长开发大数据、深度学习、网站、小程序、安卓应用和算法项目。平时从事项目定制开发、代码讲解、答辩教学和文档编写&#xff0c;也掌握一些降重技巧。感谢大家的持续关注&#xff01…

作者头像 李华
网站建设 2026/2/11 14:05:15

NestJs-拦截器

NestJS 拦截器概述拦截器&#xff08;Interceptor&#xff09;是 NestJS 的核心功能之一&#xff0c;用于在方法执行前后添加额外的逻辑。拦截器基于面向切面编程&#xff08;AOP&#xff09;思想&#xff0c;常用于日志记录、性能监控、响应格式统一等场景。拦截器的核心功能 …

作者头像 李华
网站建设 2026/2/11 14:05:12

谓的“完美本地环境”,是不是开发者体验(DX)最大的谎言?

我扔掉了本地的 Docker 和 VSCode&#xff0c;开发效率反而提升了10倍“在我电脑上明明是好的”&#xff0c;这句话我曾说过无数次&#xff0c;也听过无数次。每次新项目启动或新同事入职&#xff0c;我们总要浪费大量时间在配置开发环境上&#xff0c;过程痛苦且极易出错。我曾…

作者头像 李华
网站建设 2026/2/11 7:24:52

监督学习非监督学习的区别

监督学习&非监督学习监督学习&#xff08;Supervised Learning&#xff09;非监督学习&#xff08;Unsupervised Learning&#xff09;区分——是否有“标签&#xff08;Label&#xff09;”什么是「标签」&#xff1f;监督学习&#xff08;Supervised Learning&#xff09…

作者头像 李华
网站建设 2026/2/11 14:05:10

35、UNIX 编辑器使用技巧与用户类型分析

UNIX 编辑器使用技巧与用户类型分析 1. 在 vi 中读取标准输出 在 vi 编辑器里,有几种方法能将命令执行结果读取到当前工作会话中。 1.1 直接读取执行结果 这是实现该功能的三种可能方法中步骤最短的一种,只需一步即可完成。在命令行模式下,使用如下命令: :r! date此命…

作者头像 李华