news 2026/6/21 19:41:46

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/6/14 11:13:04

Redis篇6——Redis深度剖析:从单机到集群,Redis高可用进化史

在前面的文章中&#xff0c;我们聊了 Redis 的持久化、锁机制以及热 Key 问题。今天&#xff0c;我们跳出具体的命令细节&#xff0c;从宏观架构的角度来看看 Redis 是如何一步步“做大做强”的。在生产环境中&#xff0c;我们几乎不会只部署一台 Redis。为什么&#xff1f;因为…

作者头像 李华
网站建设 2026/6/15 14:45:38

AI 时代,程序员的核心竞争力是什么?

从确定性到概率迷雾 Martin Fowler——《重构》的作者、敏捷宣言的起草人之一&#xff0c;对当前 AI 浪潮发出了警告&#xff1a;这不是工具升级&#xff0c;这是物种突变。我们正在从确定性的工业时代&#xff0c;跌进非确定性的概率迷雾。以前程序员是计算机世界的上帝&#…

作者头像 李华
网站建设 2026/6/21 12:10:04

41、打造出色的 UNIX 系统管理员简历

打造出色的 UNIX 系统管理员简历 在竞争激烈的就业市场中,一份出色的简历是开启理想工作之门的关键。对于 UNIX 系统管理员而言,如何准备一份能吸引潜在雇主目光的简历,是迈向成功职业生涯的重要一步。 简历的基本维护 在当前工作岗位上,要持续更新简历。当参与新项目、…

作者头像 李华
网站建设 2026/6/17 3:29:03

39、Linux Shell 高级特性与技巧解析

Linux Shell 高级特性与技巧解析 1. 数组相关操作 在处理数组时,有时需要对数组元素的输出进行排序。由于数组元素扩展后的结果通常是无序的,所以可以将循环的整个输出通过管道传递给 sort 命令来实现排序。另外,使用 ${!array[@]} 扩展可以得到数组索引列表,而不是数…

作者头像 李华
网站建设 2026/6/21 13:29:25

Java设计模式系列 - 基本概念

基本思想设计模式是软件开发中经过反复验证的、解决特定问题的优秀解决方案模板。在Java开发中&#xff0c;设计模式不仅是一种编程技巧&#xff0c;更是提高代码质量、可维护性和可扩展性的重要工具。使用设计模式的主要目的是为了重用代码、让代码更容易被他人理解、保证代码…

作者头像 李华
网站建设 2026/6/18 1:44:29

非专业也能看懂的AI大模型工作原理!(非常详细)从零基础到精通,一篇就够了!

本文全面介绍AI大语言模型工作流程&#xff0c;从文本输入预处理到输出生成全过程。涵盖分词嵌入、Transformer架构、自注意力机制、位置编码及长文本外推等技术&#xff0c;并结合DeepSeek V3实例解析模型如何将语言转换为数学矩阵并生成回答。同时提供丰富的工程实践指导&…

作者头像 李华