一键从图像文件生成 PDF






4.53/5 (9投票s)
从任何类型的图像文件生成 PDF 的简单解决方案
引言
在我的一些项目中,需要进行图形的PDF性能处理。当时遇到的唯一问题是我手头没有任何将图像转换为PDF的工具。像往常一样,我开始在CodeProject上寻找解决方案。不出所料,我幸运地找到了一篇好文章:Simplest PDF Generating API for JPEG Image Content,作者是Нао Нu。同样,代码很好,想法也很好,但提供的演示稍微有些逊色。
因此,我大胆地改进了性能,通过标准MFC过程,只需几次点击即可更轻松地使用,并将支持的图像范围从jpeg扩展到CImage
类支持的任何图像。
背景
我从Нао Нu的文章中借用了Jpeg2PDF.cpp代码。在上面的代码中,我只对不适合新MFC项目的一些部分进行了注释。其他所有性能都通过标准的MFC应用程序向导使用CImage
类来处理所有类型的图像。
在开始构建提供的项目之前,强烈建议您先看一下附带的演示文稿,以便对预期的输出有所了解。
演示说明
PdfFromImgDemo目录中的可执行文件PdfFromImg.exe是使用MSVS-2010的工具通过MSVS-2015 pro构建的。因此,PdfFromImg.exe甚至对Windows-XP也有效。如果您想在Windows-XP上运行,请不要忘记将mfc100.dll、mfc100u.dll、msvcp100.dll、msvcr100.dll文件放入PdfFromImgDemo目录(或..windows\system32目录)。
为了演示PdfFromImg项目的实现,安排了一些菜单和特殊的快捷键。
- 文件菜单->追加图像(s) - 选择要追加到列表框控件列表中的图像文件。
- 文件菜单->插入图像(s) - 选择要在列表框控件的所选项目之前插入列表中的图像文件。
- 文件菜单->删除图像(s) - 删除从列表框控件列表中选定的文件。
- 文件菜单->全部清除 - 从列表框控件列表中删除所有文件。
- 文件菜单->创建 PDF - 从列表框控件列表中的所有文件创建PDF文件(也称为确定按钮)。
- 文件菜单->播放 - 播放最后创建的 PDF 文件。
- 列表框控件 - 包含要创建PDF的图像的文件名列表。
- 确定按钮 - 从列表框控件列表中的所有文件创建 PDF 文件(也称为文件菜单->创建 PDF)。
- 取消按钮 - 简单关闭对话框。
- 纵向按钮 - 创建PDF时,性能设置为纵向。
- 横向按钮 - 创建PDF时,性能设置为横向。
- 进度控件 - 在创建过程中指定当前接受到 PDF 中的图像数量。
工作顺序如下:
- 启动后,默认出现在根目录的PDFImages路径下的文件名列表。您可以根据需要使用菜单命令编辑此列表:追加图像(s)、插入图像(s)、删除图像(s)和全部清除。
- 使用追加图像(s)和插入图像(s)命令,会出现标准的文件对话框。此文件对话框具有多选属性,因此您可以从任何地方追加和插入任何类型的图像文件到列表中(请记住,图像的大小应大致相等,最好完全相等)。
- 使用创建 PDF命令(或按下确定按钮),会出现用于保存的标准文件对话框。默认情况下,建议在根目录的PDFFiles路径下保存。这不是强制性的,您可以将 PDF 文件保存为任何名称,在任何您喜欢的地方。创建完成后,会显示一个带有创建路径名的
MessageBox
。 - 最后一个创建的PDF可以通过文件->播放命令启动。
因此,如果您最初在默认的PDFImages文件夹中准备了所有必需的图像文件,一旦启动,只需按确定按钮,即可在一键内获得根目录中的PDF文件。
以上所有命令也可在帮助对话框中找到,只需按F1键。
帮助对话框是非模态的,因此您可以选择列表控件中的任何命令,然后按确定按钮或双击鼠标左键。
在关于对话框中,引用了Hao Hu的原文章。
构建说明
解决方案配置必须设置为 **Release**,平台设置为 **x86**。
提供的项目是用MSVS-2012 pro并利用MSVS-2010的工具开发的。因此,EXE文件甚至对Windows-XP也有效。如果您不需要在Windows-XP中运行该应用程序,只需将工具更改为MSVS-2012即可。
默认编码属性为 UNICODE;尽管 MBCS 编码也可用,只需更改属性即可。
即使您是第一次使用MSVS,只需选择菜单调试->开始但不调试,程序PdfFromImg.exe应该就可以开始构建和运行了。
项目源文件和数据存储
PdfFromImgproj路径中的标准源代码是通过标准的MFC应用程序向导创建的。
- PdfFromImg.cpp - 定义应用程序的标准类行为。
- PdfFromImgDlg.cpp - 标准
CDialogEx类
的实现;作者使用标准的MFC应用程序向导程序创建的消息处理过程。 - Jpeg2PDF.cpp - 从文章“Simplest PDF Generating API for JPEG Image Content”(作者Нао Нu)借用;我只对不适合新MFC项目的一些部分进行了注释。
- PdfFromImg.rc和resource.h - 作者使用标准的资源向导程序创建的菜单、对话框、加速器资源。
根目录中包含示例图像的默认PDFImages
路径来自我之前的文章《Masking Texture in OpenGL using Class CImage》。这不是强制性的,您可以根据需要更改此路径的内容,或准备其他目录用于存储图像。
建议在根目录中保存创建的PDF结果。这不是强制性的,您可以将PDF文件保存为任何名称,在任何您喜欢的地方。
代码解释
所有菜单和快捷键命令都使用了标准的MFC AppWizard技术。因此,我没什么好解释的,比标准教程更好。标准FileDialog Box
中的多文件选择用法在我之前的Code Project文章《Avi from Image Files in One Click》中已经解释过。
所有图像文件都使用CImage
类在临时路径下转换为jpg格式。
for(int i=0; i< m_imgArray.GetSize(); i++) //for all file names in list box:
{
CString fString = m_imgArray.GetAt(i); //pick up current file name
CString strExt = GetFileExtention(fString); //extract the extension
CString strN = strFormat(_T("\\%000d.jpg"), i+1); //create numerated file name
CString tString = tempDir + strN;
if(strExt == _T("jpg")) //if extension is jpg
CopyFile(fString, tString, FALSE); //just copy current file
else //otherwise
{
CImage img;
img.Load(fString); //load file as CImage
img.Save(tString); //save CImage as jpg
}
}
请注意,一次添加到m_listArray
的文件路径名与添加到m_listBox
的文件名相同。因此,可以从位于不同目录的任何类型的图像创建PDF。
至于Jpeg2PDF.cpp中的struct Jpeg2PDF
,我认为最好参考文章作者Нао Нu。
使用提供的项目开发您自己的应用程序。
您可以获取整个项目,将其重命名为我之前CodeProject文章《MFC Project from Existing Code in One Click》中的项目,然后按您喜欢的方式组合和改进代码。
或者,您可以从本项目中获取Jpeg2PDF.cpp文件,并通过菜单项目->现有项将其包含在任何图像处理项目中。
或者,您可以简单地使用提供的演示中的PdfFromImg.exe来将您的图像整理到PDF文件中。
如果您引用我的代码,将不胜感激。
兴趣点和致谢
当然,您可以使用像PDFElement
或任何其他PDF处理程序之类的常规专业程序将收集的图像技术转换为PDF。但所有这些复杂的程序都是通过闭源实现的。因此,您无法像您喜欢的那样安排一些技巧和效果。
非常感谢Нао Нu的出色工作。
历史
- 2022年4月30日:初版