DFLib是用于创建PDF文档的开发库,提供了简单易用的API,隐藏了创建PDF的复杂细节且不需要第3方软件的支持。PDFLib库对于个人是免费的,对于商业产品需要购买许可。
PDFlib [1] 是一个帮助您生成符合 Adobe 的可移植文档格式 (PDF) 文件的中间件。 PDFlib 充当用户自己程序的后端。当应用程序员负责抽取要处理的数据时,PDFlib承担生成 PDF 输出(图解数据)的任务。PDFlib 让您无需再关注 PDF 的内部细节问题,并提供了各种方法来帮助您设置输出的格式。发布软件包在同一个二进制文件中包含了不同的产品:
> PDFlib 包含创建 PDF 输出(包括文本、矢量图形和图像以及超文本元素)所必需的所有函数。 PDFlib 为放置单行或多行文本、图像和创建表提供了强大的格式化功能。
> PDFlib+PDI 包括所有 PDFlib 函数,以及用于在输出的文件中嵌入现有的 PDF 文档页PDF 输入库 (PDI),及用于查询导入文档中任意 PDF 对象(例如列出页面上的所有字体、查询元数据等等)的 pCOS 接口。
> PDFlib Personalization Server (PPS) 包括 PDFlib+PDI 以及用于自动填充 PDFlib 块的附加函数。块是页上的占位矩形,可以用文本、图像或 PDF 页进行填充。可以使用适用于Adobe Acrobat (Mac 或 Windows)的 PDFlib 块插件交互式创建块,并使用 PPS 自动进行填充。该插件包含在 PPS 中。
1.获取文件夹中所有的pdf文件路径
从文件夹中遍历pdf文件,后续的处理流程可写在遍历循环中。
CFileFind ff;
strMusicFolder += _T("\\");
strMusicFolder += _T("*.pdf");
BOOL res = ff.FindFile(strMusicFolder);
while (res)
{
res = ff.FindNextFile();
if (!ff.IsDirectory() && !ff.IsDots())
{
AfxMessageBox(ff.GetFilePath());
}
}
ff.Close();
2.创建目标pdf文件
分割与合并结果的输出pdf文档。
compatibility=1.7版本号
CString dst;
PDFlib m_oPDF;
dst = src + _T("\\Dst.pdf");
if (m_oPDF.begin_document(dst.GetString(), L"compatibility=1.7") == -1)
{
AfxMessageBox(L"创建pdf文件失败!");
return false;
}
3.循环导入待操作pdf
依次读入待操作的pdf,分割写入操作完成后关闭操作pdf。
int pdfdeletesheet; //保留的pdf抬头页数
int nSrcPDFID;
while (res)
{
res = ff.FindNextFile();
if (!ff.IsDirectory() && !ff.IsDots())
{
CString show = ff.GetFilePath().GetString();
if (show == dst)
{
continue;
}
count++;
if (count == 1)
{
nSrcPDFID = m_oPDF.open_pdi_document(ff.GetFilePath().GetString(), L"");
if (nSrcPDFID == -1)
{
AfxMessageBox(L"打开源pdf文件失败!");
return false;
}
int endpage = (int)m_oPDF.pcos_get_number(nSrcPDFID, L"length:pages");//总页数
auto fWidth = (m_oPDF.pcos_get_number(nSrcPDFID, L"pages[0]/width"));//宽度595
auto fHeight = m_oPDF.pcos_get_number(nSrcPDFID, L"pages[0]/height");//高度842
int nFontId = m_oPDF.load_font(L"微软雅黑", L"host", L"");
if (nFontId == -1)
{
printf(u8"##PdfAddWaterMarker, 默认字体(微软雅黑)加载失败!");
return false;
}
for (int pageno = 1; pageno <= endpage; pageno++)
{
//获取准备绘制的页面标识
int page = m_oPDF.open_pdi_page(nSrcPDFID, pageno, L"");
if (page == -1)
{
return false;
}
//向文档添加新页,并指定各种选项 L""
m_oPDF.begin_page_ext(fWidth, fHeight, L"");
m_oPDF.setfont(nFontId, 18);
//在页面上放置导入的PDF页面,并根据不同的选项进行操作。
m_oPDF.fit_pdi_page(page, 0, 0, L"adjustpage");
m_oPDF.end_page_ext(L"");
m_oPDF.close_pdi_page(page);
}
m_oPDF.close_pdi_document(nSrcPDFID);
}
else
{
nSrcPDFID = m_oPDF.open_pdi_document(ff.GetFilePath().GetString(), L"");
if (nSrcPDFID == -1)
{
//printf(u8"##打开源pdf文件失败!");
AfxMessageBox(L"打开源pdf文件失败!");
return false;
}
int endpage = (int)m_oPDF.pcos_get_number(nSrcPDFID, L"length:pages");//总页数
auto fWidth = (m_oPDF.pcos_get_number(nSrcPDFID, L"pages[0]/width"));//宽度595
auto fHeight = m_oPDF.pcos_get_number(nSrcPDFID, L"pages[0]/height");//高度842
int nFontId = m_oPDF.load_font(L"微软雅黑", L"host", L"");
if (nFontId == -1)
{
printf(u8"##PdfAddWaterMarker, 默认字体(微软雅黑)加载失败!");
return false;
}
for (int pageno = 1+pdfdeletesheet; pageno <= endpage; pageno++)
{
//获取准备绘制的页面标识
int page = m_oPDF.open_pdi_page(nSrcPDFID, pageno, L"");
if (page == -1)
{
return false;
}
//向文档添加新页,并指定各种选项 L""
m_oPDF.begin_page_ext(fWidth, fHeight, L"");
m_oPDF.setfont(nFontId, 18);
//在页面上放置导入的PDF页面,并根据不同的选项进行操作。
m_oPDF.fit_pdi_page(page, 0, 0, L"adjustpage");
m_oPDF.end_page_ext(L"");
m_oPDF.close_pdi_page(page);
}
m_oPDF.close_pdi_document(nSrcPDFID);
}
//AfxMessageBox(ff.GetFilePath());
}
}