使用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;
}
相关推荐
Chrikk6 小时前
基于 RAII 的分布式通信资源管理:NCCL 库的 C++ 封装
开发语言·c++·分布式
阿沁QWQ7 小时前
C++哈希表设计
开发语言·c++·散列表
大卡拉米7 小时前
前端组件库 PDF、word、Excel预览
前端·pdf·word
Yu_Lijing7 小时前
基于C++的《Head First设计模式》笔记——策略模式
c++·笔记·设计模式
鸿儒5177 小时前
记录一个C++操作8位影像的一个bug
开发语言·c++·bug
脏脏a7 小时前
深度剖析 C++ string:从 0 到 1 的模拟实现与细节解析
开发语言·c++
福尔摩斯张7 小时前
【实战】C/C++ 实现 PC 热点(手动开启)+ 手机 UDP 自动发现 + TCP 通信全流程(超详细)
linux·c语言·c++·tcp/ip·算法·智能手机·udp
罗湖老棍子7 小时前
【例3-3】医院设置(信息学奥赛一本通- P1338)
数据结构·c++·算法·
历程里程碑7 小时前
C++ 4:内存管理
java·c语言·开发语言·数据结构·c++·笔记·算法
LXS_3577 小时前
Day17 C++提高 之 类模板案例
开发语言·c++·笔记·算法·学习方法