使用GDI+、文件和目录和打印API,批量将图片按文件名分组打包成PDF

代码写了两个小时,速度太慢(包括学习文档的时间)

cpp 复制代码
#include <stdio.h>
#include <Windows.h>
#include <gdiplus.h>
#include <string.h>
using namespace Gdiplus;
#pragma comment(lib, "Gdiplus.lib")
enum {
	IDLEN=30,
	FNAME=IDLEN+5,//.pdf
};

int main(void) {
	GdiplusStartupInput gsi;
	ULONG_PTR tok;
	GdiplusStartup(&tok,&gsi,nullptr);
	HDC print=CreateDCA("WINSPOOL","Microsoft Print to PDF",nullptr,nullptr);

	SetCurrentDirectoryA("D:\\pic2pdf");
	WIN32_FIND_DATAW fd;
	HANDLE hf=FindFirstFileW(L"*.jpg",&fd);
	if (hf) {
		puts("找到了jpg文件");

		wchar_t f[FNAME];
		wchar_t* p=wcschr(fd.cFileName,L'_');
		wcsncpy(f,fd.cFileName,p-fd.cFileName);
		wcscpy(p-fd.cFileName+f,L".pdf");

		DOCINFOW doc{};
		doc.cbSize=sizeof doc;
		doc.lpszDocName=doc.lpszOutput=f;
		StartDocW(print,&doc);
		StartPage(print);
		Graphics g(print);

		while (true) {
			Image img(fd.cFileName);
			g.DrawImage(&img,0,0);
			EndPage(print);

			if (FindNextFileW(hf,&fd)) {
				wchar_t f1[FNAME];
				p=wcschr(fd.cFileName,L'_');
				wcsncpy(f1,fd.cFileName,p-fd.cFileName);
				wcscpy(p-fd.cFileName+f1,L".pdf");
				if (wcscmp(f,f1)) {
					EndDoc(print);
					wprintf(L"%s\n",f);
					wcscpy(f,f1);
					StartDocW(print,&doc);
				}
			} else {
				EndDoc(print);
				wprintf(L"%s\n",f);
				break;
			}
		};
	}
	return 0;
}
相关推荐
微露清风13 分钟前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
CSARImage1 小时前
C++读取exe程序标准输出
c++
一只小bit1 小时前
Qt 常用控件详解:按钮类 / 显示类 / 输入类属性、信号与实战示例
前端·c++·qt·gui
一条大祥脚1 小时前
26.1.9 轮廓线dp 状压最短路 构造
数据结构·c++·算法
项目題供诗2 小时前
C语言基础(一)
c++
@areok@2 小时前
C++opencv图片(mat)传入C#bitmap图片
开发语言·c++·opencv
鸽芷咕2 小时前
【2025年度总结】时光知味,三载同行:落笔皆是沉淀,前行自有光芒
linux·c++·人工智能·2025年度总结
羑悻的小杀马特2 小时前
指尖敲代码,笔尖写成长:2025年度总结与那些没说出口的碎碎念
linux·c++·博客之星·2025年度总结
linweidong3 小时前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
cpp_25013 小时前
P2708 硬币翻转
数据结构·c++·算法·题解·洛谷