news 2026/7/16 9:33:32

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/7/15 3:03:09

RN Navigation vs Vue Router:从架构底层到工程实践的深度对比

[toc] 前言&#xff1a;这不是“谁更好”&#xff0c;而是“谁解决的问题不同” 很多团队在同时做 Web 和 RN 项目时&#xff0c;都会下意识问一句&#xff1a;Vue Router 这套东西&#xff0c;在 RN 里能不能也照着来&#xff1f;如果你只是做 Demo&#xff0c;答案是「看起来…

作者头像 李华
网站建设 2026/7/16 16:23:33

廊坊的婚介所靠谱吗?

我叫林晓阳&#xff0c;28岁&#xff0c;廊坊某科技公司程序员。三年前在相亲角遇到现在的丈夫&#xff0c;但那次经历让我对婚恋市场产生了深刻的认知。那年我抱着试试看的心态&#xff0c;走进了当地最大的婚介所。接待我的姑娘笑容甜美&#xff0c;递来一份精心设计的问卷&a…

作者头像 李华
网站建设 2026/7/14 22:45:40

新能源与燃油汽车对比数据可视化分析

新能源与燃油汽车对比数据可视化分析 1. 项目概述 本项目旨在通过数据挖掘技术,深入分析中国汽车市场中新能源汽车(EV)与传统燃油汽车(Gasoline)的竞争格局、销售趋势及关键影响因素。系统集成了数据预处理、探索性数据分析(EDA)、机器学习销量预测模型以及交互式Web可…

作者头像 李华
网站建设 2026/7/15 2:15:06

37、UNIX系统用户管理与支持全攻略

UNIX系统用户管理与支持全攻略 1. 用小事留下大印象 在与用户的交互中,一些看似微不足道的小事往往能给用户留下深刻的印象。以下是几个具体的方法: 1.1 倾听用户 作为管理员,日常工作总是十分繁忙,任务清单上总有做不完的事情。无论是在走廊上偶遇用户,还是用户打电话…

作者头像 李华
网站建设 2026/7/16 15:52:43

38、UNIX系统用户管理与故障处理全攻略

UNIX系统用户管理与故障处理全攻略 1 UNIX系统中的故障类型及时间预估 在使用UNIX服务器时,故障停机是难以避免的情况,而且要配合用户的使用时间来安排故障处理往往颇具挑战。常见的故障类型有以下三种: - 定期计划故障 :在生产环境中,这些是固定的停机时间,所有用户…

作者头像 李华
网站建设 2026/7/16 3:52:12

39、深入了解 UNIX 系统管理职业:层级、要求与发展路径

深入了解 UNIX 系统管理职业:层级、要求与发展路径 1. 引言 UNIX 系统管理工作涵盖了诸多方面,如求职、应对面试、面试候选人等。同时,还涉及与供应商、销售代表、响应中心、帮助台以及支持工程师的协作。这份工作远不止坐在终端前那么简单,接下来我们将详细了解 UNIX 系…

作者头像 李华