65.9K
CodeProject 正在变化。 阅读更多。
Home

一键从图像文件生成 PDF

2022 年 4 月 30 日

CPOL

7分钟阅读

viewsIcon

6759

downloadIcon

1194

从任何类型的图像文件生成 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.dllmfc100u.dllmsvcp100.dllmsvcr100.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.rcresource.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日:初版
© . All rights reserved.