C++ PDF文档相关操作

C++——入门基础(上) ①定义命名空间,需要用到namespace关键字,后面跟着命名空间的名字,然后用一对{}连接,{}中为命名空间的成员。命名空间可以定义变量/函数/类型等。与结构体的区别是:{}后面没有分号;//变量//函数//类型int val;②namespace本质是定义出一个域,这个域跟全局域各自独立。③不同的域可以定义同名变量,因此下面的两个rand不会冲突。int val;int main()//这里默认访问的是全局的rand函数指针(即头文件stdlib.h中的) 阅读详情

    人生总是在赶着一个又一个的期限,直到最后的大限。

    近来基本没更新过博客,实在是准备雅思看英语加上调节老看英语后的烦躁心情闹的。本来以为考完研就与大考再也不见了,这种想法实在是 Too young,Too naive。之前做过一个项目,是关于在Windows平台下用C++实现PDF文档制作的相关操作的,今天有点心情拿来总结下。

    关于PDF的库其实有不少,本人因为一开始用神器搜到的是PDFlib,就用这个库做了。这就是所谓的缘分吧。

    PDFlib并非是开源库,要使用需要付费,否则会有一个让人不要不要的水印在页面的后头。当然,我大天朝从来无需理会这些,有压迫的地方就总会有雷锋站出来搞个破解版,该库也不例外,有需要可以到这位雷锋的博客地点去下载。如果实在是懒也可以下载本人的DEMO工程,里面已经配置好了该库,不过由于本人本着折腾到死的心态做程序员,该工程的环境是最新的VS2015,如果你的版本不是最新的,下载了请自己默哀,十分我是不会还回去的哈哈。

    PDFlib是一个标准的动态链接库,跟其他的动态链接库的配置方法一样,把pdflib.lib、pdflib.dll和pdflib.h放到工程目录下并放入pdflib.lib这个附加依赖项,在工程中包含pdflib.h这个现有项就算完成配置了。接下来就是如何去用这个库了,一开始在文件中包含pdflib.h头文件这事应该都是了然的。

    具体的使用,网上有一些现成的例子,然而没有见过能解决好中英文交杂在一起的问题的。因为网上百分之八九十都是建议用PDFlib自带的字库,而很遗憾的是这些字库对中文支持的都不怎么好且字体也就那么几种,在一般情况下能分开去调用中英文也就算了,然而在一些中英文同时出现的情况下单单是排版的间隙问题就给跪了,要写程序去遍历里面的字符再区分出来对待,劳民伤财,要死要活。这个工作本人是做了的,后来无意间发现某些博客偶然提及的可以调用本地字库,于是决心尝试一番。真是不试不知道,一试一口老血差点吐出来,本地字库完美支持中英文不说,字体也是要什么有什么。。。有时一些博客真是误导死人。。。所以本人在此强烈建议要用这个库的程序猿直接去C:\Windows\Fonts这个路径下找到你喜欢的字体弄出来,然后放到你的工程目录下拿来调用,什么自带字体完全是坑爹的!!!下面直接上代码,输出一个页面上是《将进酒》的PDF文件。(建一个win32控制台空白工程并配置好环境后把下面这串代码拷进去理论上来说你也是可以运行的。)

#include "pdflib.h"
#include <afx.h> 

void String2text(PDF *p, int &TextFlow, CString &mPagenameAndDate, int fontsize)
{
	char characteristic_cn[100];
	int mPagenameAndDateSize = mPagenameAndDate.GetLength();//字符串长度
	PDF_set_parameter(p, "FontOutline", "a=./font/STXINGKA.TTF");//这里的“./font/STXINGKA.TTF”为字体文件的存放路径,也就是说需要将字库文件放到相应的位置,不然会造成错误
	sprintf_s(characteristic_cn, "fontname=a:0 fontsize = %d encoding = unicode textlen = %d", fontsize, mPagenameAndDateSize * 2);//中文字符
	PDF_add_textflow(p, TextFlow, (char *)(mPagenameAndDate).AllocSysString(), mPagenameAndDateSize * 2, characteristic_cn);//添加字符段内容
}

void OutputStringToPDF(PDF *p, CString &mPagenameAndDate, int Left, int &Top, int Right, int Reduction, int fontsize)//数据输出
{
	//该函数输出数据到PDF中,需要注意的是在输出到页未的时候会自行进行换页
	if (Top<130)
	{
		Top = 740;
		PDF_end_page_ext(p, ""); // 关闭页面并开启新的页面
		PDF_begin_page_ext(p, a4_width, a4_height, "");
	}
	int TextFlow = PDF_create_textflow(p, "", 0, "");//创建字符段
	String2text(p, TextFlow, mPagenameAndDate, fontsize);
	while (true)
	{
		const char *returnstring = PDF_fit_textflow(p, TextFlow, Left, Top, Right, Top - Reduction, "");
		Top -= Reduction;
		if (strcmp(returnstring, "_boxfull") != 0)//对象满了
		{
			break;
		}
		if (Top<130)
		{
			Top = 740;
			PDF_end_page_ext(p, ""); // 关闭页面并开启新的页面
			PDF_begin_page_ext(p, a4_width, a4_height, "");
		}
	}
	PDF_delete_textflow(p, TextFlow);//释放字符串对象
}

void main()
{
	PDF *p = NULL;
	int Left = 85, Top = 740, Right = a4_width - 85;
	//pdf对象创建
	if ((p = PDF_new()) == (PDF *)0)
	{
		printf("Couldn't create PDFlib object (out of memory)!n");
	}
	PDF_TRY(p)
	{
		//先创建PDF文档,名为outout.pdf
		if (PDF_begin_document(p, "output.pdf", 0, "") == -1)
		{
			printf("Error: %sn", PDF_get_errmsg(p));
		}
		//再创建PDF文档里面的页面,并填入页面的内容,这里本人将其封装成了两个函数
		PDF_begin_page_ext(p, a4_width, a4_height, "");
		CString mPagenameAndDate = L"君不见黄河之水天上来  奔流到海不复回\n";
		mPagenameAndDate += L"君不见高堂明镜悲白发  朝如青丝暮成雪\n";
		mPagenameAndDate += L"人生得意须尽欢  莫使金樽空对月\n";
		mPagenameAndDate += L"天生我材必有用  千金散尽还复来\n";
		mPagenameAndDate += L"烹羊宰牛且为乐  会须一饮三百杯\n";
		mPagenameAndDate += L"岑夫子  丹丘生  将进酒  杯莫停\n";
		mPagenameAndDate += L"与君歌一曲  请君为我倾耳听\n";
		mPagenameAndDate += L"钟鼓馔玉不足贵  但愿长醉不复醒\n";
		mPagenameAndDate += L"古来圣贤皆寂寞  惟有饮者留其名\n";
		mPagenameAndDate += L"陈王昔时宴平乐  斗酒十千恣欢谑\n";
		mPagenameAndDate += L"主人何为言少钱  径须沽取对君酌\n";
		mPagenameAndDate += L"五花马  千金裘\n";
		mPagenameAndDate += L"呼儿将出换美酒  与尔同销万古愁\n";
		//将文字输出到PDF,第三个参数为输出的左边距,第四个参数为输出的高度,第五个参数为输出的右边距,第六个参数为行距,第七个则是字体的大小
		OutputStringToPDF(p, mPagenameAndDate, Left, Top, Right, 45, 24);
		//页结束
		PDF_end_page_ext(p, "");
		//文档结束
		PDF_end_document(p, "");
	}
	PDF_CATCH(p)//错误信息输出
	{
		printf("[%d] %s: %sn",PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p));
		PDF_delete(p);
	}
	PDF_delete(p);
	//打开pdf
	system("output.pdf");
}
    效果如下:
    由于本人做工程只用到了输出PDF文件的那个部分,所以关于读取PDF文件的部分是没有写的,以后如果有做到则会放上来。至于更多的细节,则可以参考PDFlib的手册,这个手册我也会跟我的demo一起打包起来,这是demo地址。

C/C++中文参考手册离线最新版 C/C++中文参考手册(C++23标准) 离线chm最新版”是一份非常优秀的C/C++参考手册,它涵盖了C/C++语言的所有重要概念和语法,并包含了最新的C++23标准,让开发者能够使用最新的功能和特性。此外,该手册还涵盖了STL和Boost库的内容,让开发者能够更好地使用这些库。该手册采用离线的chm格式,可以在Windows操作系统上使用,易于使用。如果您是一名C/C++开发者,不妨下载并使用该手册,它将为您的编程工作提供有力的帮助和支持。 阅读详情

相关推荐

十、Qt 操作PDF文件

Qt使用Poppler库,打开PDF文件

3517

C语言大纲

数据类型 运算符,表达式和语句 循环 分支与跳转 函数 数组 结构体,联合体 指针 宏定义 1-数据类型

weixin_64499720的博客 888

C++:操作PDFlib库实例(附完整源码)

C++:操作PDFlib库实例(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1148

C++11

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。综合而言,左值就是可以取地址的对象。这个b也认定成左值,它很特殊,因为一般的左值都是可以取地址和赋值的,这个b只能取地址不能赋值。右值也是一个表示数据的表达式,如:字面常量、表达式返回值,传值返回函数的返回值(这个不能是左值引用返回)等等,

cls的博客 3600

C#与PDFsharp库实现PDF打印操作指南

PDFsharp 是一个用于处理PDF文件的库,它为.NET开发者提供了强大的API来创建、修改、渲染以及打印PDF文件。PDFsharp 功能全面,可操作性高,支持直接在PDF文档中添加文本、图像、形状以及复杂的图形,同时也可以编辑现有PDF内容。特点如下:跨平台支持:能够在Windows、Linux和macOS上运行,提供了一个统一的API来处理PDF文件。C#和VB.NET支持:库原生支持C#和VB.NET两种.NET主流语言,易于学习和使用。DOM操作。

weixin_42527589的博客 2886

利用 C++ PDFlib 库创建无水印 PDF 文件

PDFlib是一款功能强大的库,用于在应用程序中创建、修改、抽取、转换和渲染PDF文档。它支持所有PDF标准特性,并允许开发者以编程方式与PDF文档交互,无需依赖第三方应用程序或复杂的图形用户界面(GUI)操作。PDFlib库提供了丰富的API组件,它们共同工作以生成和处理PDF文件。核心组件包括:Pdflib:创建PDFlib对象的类,用于管理PDFlib库的实例。:代表一个PDF文档,用于添加页面、内容和注释。PDFPage:表示一个单独的PDF页面,包含页面内容和属性。

weixin_35871529的博客 1201

C++ - PDF mark

 ideaOS^(BOOL coding) 1185

深入解析PDF文件结构的C++实践

PDF(Portable Document Format)是由Adobe Systems于1993年开发的文件格式,旨在呈现和交换电子文档,保持其格式和内容的不变性。PDF格式广泛应用于文件共享、电子书籍、政府文档、技术手册等,因其跨平台兼容性和不易篡改的特点,成为重要的数字化文档标准。在开始编码之前,了解PDF解析的理论基础是至关重要的。PDF文件由一系列的文本和二进制数据组成,遵循特定的格式规范。PDF文件的主要组成部分包括:文件头:包含标识PDF文件的关键信息和版本信息。

weixin_35390379的博客 1485

mfc word转pdf

1、使用word自带的api Word转PDF源码-C++开发_c++word转pdf,vcword转pdf-C++文档类资源-优快云下载 ​​​​​​C++操作Word转pdf_Anything_gy的博客-优快云博客_c++ word转pdf

tajon1226的专栏 533

一文详细讲解CRM系统(附架构图、流程、功能介绍)

专为中小企业量身打造高性价比的数字化转型路径!企业如何用CRM才能真正做到降本增效?今天,就用一文讲清这些问题!读完本文,你将清楚得了解CRM的概念、框架、流程、功能、企业成功案例,文末还有常见问题解答。

Dabeishandong的博客 9930

【GAMES101】现代计算机图形学入门 资料整理

课程网址 课程主页 包括ppt 课程PPT和视频 一篇搞定!GAMES101现代计算机图形学入门(全) 作业链接地址 作业论坛 GAMES101课程环境搭建(Win10+VSCode) 计算机图形学笔记 虎书pdf 提取:n2rx 【必须】:高等数学(微积分、线性代数)、算法、数据结构 【非必须】:信号处理、数值分析、大学物理(光学) 在线公式编辑器 一定要做作业,如果个人要配置环境的话应该是配置opencv,eigen这两个核心库就行了,目前觉得最核心的一个作业是作业3,实现着色器和渲染管线,做完一遍

ysh的博客 2684

python-poppler - PDF文档处理Python绑定库

一、关于 python-poppler 1、项目概览 二、相关链接资源 三、安装与使用 1、安装方式 2、基础示例 四、开发贡献

AI工程化、开源分享、文档翻译、代码笔记 543

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 687

VS2008操作Word2007 2010保存为PDF

在使用pdflib这个pdf二次开发库的时候,需要将word添加到pdf中,可是pdflib库支持图片和pdf文件的导入,不支持word文件的导入。想到word2007及以上的版本可以直接另存为pdf,所以动了使用word的转换为pdf的念头。 这里写了个测试小程序,下面说介绍下步骤:     1、创建MFC应用程序,默认unicode,无需修改工程类型     2、右键解决方案,添加类,M

好学近乎知,知耻近乎勇 4100

qt5.14.2+vs2019配置msvc2017编译器

qt5.14.2+vs2019配置msvc2017编译器 在使用qt编译程序时此前一直使用的是自带的MinGW 32-bit和64-bit,现在想使用msvc编译器。本次使用的是qt5.14.2,vs2019,需要配置msvc2017的32-bit和64-bit编译器。 1、首先安装好qt5.14.2和vs2019,其次在visual studio installer选择修改,然后选择msvc2017对应的组件,本次安装的是这两个 2、打开qt creator的工具–选项–kits–编译器,选择Manu

bangtanhui的博客 1万+

生信分析进阶14 - 从GTF文件提取基因、转录本、TSS和TSE

从GTF文件提取基因、转录本、TSS和TSE

LittleComputerRobot的博客 678

C++实现PDF文件分页打印等功能

C++实现PDF文件分页打印等功能 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了一份C++资源文件,能够通过Adobe打印API实现对PDF文件进行分页打印和全部打印的功能。具体实现细节和API使用方法,请参考OCX中的相关方法。 该资源文件基于C++语言,通过调用Adobe PDF打印的相关接口,开发者可以在应用程序中轻松实现PDF文件的分页打印和全部打印功能。...

gitblog_06770的博客 380

Python APP反爬实战:Frida+Charles抓包,破解签名校验

Charles抓包定位参数 → jadx-gui反编译找函数 → Frida Hook拿密钥/规则 → Python还原签名算法;Frida的核心价值:Hook住APP的加密函数,拿到“输入(密钥/参数)+输出(签名)”,无需懂复杂的逆向底层;严格对齐APP的参数排序、拼接规则、加密算法,差一点都会验证失败。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1537

学生成绩管理系统

资源内容:源程序(.cpp)+说明文档(PDF)

weixin_46006376的博客 92

[Dify实战] 项目复盘助手:自动拉数据、生成复盘报告

本文介绍如何利用Dify平台构建自动化项目复盘助手,解决传统人工复盘效率低、易遗漏等问题。系统通过自动拉取Git/Jira等数据源,计算关键指标后,由LLM生成结构化复盘报告。文章详细讲解了数据采集、指标计算、Prompt设计等核心模块的实现,并分享了完整Workflow搭建步骤。实践表明,该系统能将复盘耗时从4小时缩短至10分钟,显著提升数据准确率和执行频率。最后总结了数据一致性、输出质量等常见问题的解决方案,强调Dify+LLM组合可实现复盘流程的自动化流水线。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 118

如何实现Docker镜像导入导出 ?

摘要: Docker镜像迁移与备份可通过两种方式实现:1)镜像操作(save/load)完整保存分层结构和元数据,适用于完整备份;2)容器操作(export/import)仅保存文件系统快照,适合创建轻量模板。关键区别在于前者保留历史记录和分层,后者生成单层镜像。save/load命令示例:docker save -o nginx.tar nginx:latest,export/import示例:docker export -o container.tar abc123 && docker

weixin_39291964的博客 875

C++使用PoDoFo库处理PDF文件

PoDoFo 是一个用 C++ 编写的自由开源库,专用于 读取、写入和操作 PDF 文件。它适用于需要程序化处理 PDF 文件的应用程序,比如批量生成、修改、合并、提取元数据、绘图等。

old_power的博客 2585

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Poppler - 高性能的PDF文档处理库

Poppler - 高性能的PDF文档处理库 项目地址:https://gitcode.com/gh_mirrors/po/poppler 是一个用于 PDF 文档处理的强大开源库。它提供了一系列高级功能,包括页面提取、文本提取、注释和书签处理等。 Poppler 可以用来做什么? 文本和图像提取:从 PDF 文件中提取文本和图像,进行进一步处理或保存为其他格式。 PDF 转换:将 PDF 文件...

gitblog_00001的博客 4517

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

2 款 .NET 开源、简洁、高效的 PDF 文档操作库

今天大姚给大家分享 2 款 .NET 开源、简洁、高效的 PDF 文档操作库,希望可以帮助大家高效处理 PDF 文档的相关需求。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 956

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

.NET 使用 DocNET 库快速高效的操作 PDF 文档

当然这里不仅仅只有C#/.NET/.NET Core还有前端、云原生(Docker,K8s)、分布式,微服务、实用工具、学习书籍、AIGC、AI赋能、求职和招聘资讯、热点资讯等多个领域,我们致力于构建一个积极向上、和谐友善的.NET技术交流、学习平台。该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。PDF 文档,作为日常工作中不可或缺的文档格式,广泛应用于各类场景。

dotNET跨平台 183

PoDoFo:终极C++ PDF处理开源库完整指南

在当今数字化时代,**PDF文档处理**已成为企业和个人日常工作中不可或缺的一部分。PoDoFo作为一个功能强大的**C++ PDF处理开源库**,为开发者提供了完整的PDF文档创建、解析和编辑解决方案。无论是构建PDF生成工具、实现文档自动化处理,还是开发高级PDF分析应用,PoDoFo都能提供专业级的支持。 ## 🚀 为什么选择PoDoFo库? PoDoFo是一个基于**C++17标准*

gitblog_01093的博客 985
上一篇: C++ 嵌入汇编程序提高计算效率
下一篇: MFC RS232串口通信
_寒潭雁影
博客等级 码龄14年 2809粉丝 343原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值