C++编辑修改PDF
PDFWriter是一个易于使用的C++创建、修改PDF文档的库
1.创建一个PDF文件
#include
#include “PDFWriter.h”
int main()
{
std::cout << “Hello World!\n”;
PDFWriter pdfWriter;
int ret=pdfWriter.StartPDF(“D:\mytestwriterpdf.pdf”, ePDFVersion13);
if (ret == eSuccess)
{
std::cout << “StartPDF Success” << std::endl;
}
ret=pdfWriter.EndPDF();
if (ret == eSuccess)
{
std::cout << “EndPDF Success” << std::endl;
}
}


2.创建一个页面
#include
#include “PDFWriter.h”
#include “PDFPage.h”
int main()
{
std::cout << “Hello World!\n”;
PDFWriter pdfWriter;
int ret=pdfWriter.StartPDF(“D:\mytestwriterpdf.pdf”, ePDFVersion13);
if (ret == eSuccess)
{
std::cout << “StartPDF Success” << std::endl;
}
PDFPage* page = new PDFPage();
//将"媒体框"设置为A4 //请注意,PDF 页面具有比媒体框更多的框定义。PDF 定义了裁剪框、出血框、修剪框和艺术框。您可以分别使用 SetCropBox、SetBleedBox、SetTrimBox和SetArtBox来设置这些框。SetCropBoxSetBleedBoxSetTrimBoxSetArtBox
page->SetMediaBox(PDFRectangle(0, 0, 595, 842));
pdfWriter.WritePage(page);
delete page;
ret=pdfWriter.EndPDF();
if (ret == eSuccess)
{
std::cout << “EndPDF Success” << std::endl;
}
}

3.页面插入图像
#include
#include “PDFWriter.h”//核心
#include “PDFPage.h”//页面
#include “PageContentContext.h”//上下文
int main()
{
std::cout << “Hello World!\n”;
PDFWriter pdfWriter;
int ret=pdfWriter.StartPDF(“D:\mytestwriterpdf.pdf”, ePDFVersion13);
if (ret == eSuccess)
{
std::cout << “StartPDF Success” << std::endl;
}
PDFPage* page = new PDFPage();
//将"媒体框"设置为A4 //请注意,PDF 页面具有比媒体框更多的框定义。PDF 定义了裁剪框、出血框、修剪框和艺术框。您可以分别使用 SetCropBox、SetBleedBox、SetTrimBox和SetArtBox来设置这些框。SetCropBoxSetBleedBoxSetTrimBoxSetArtBox
page->SetMediaBox(PDFRectangle(0, 0, 595, 842));
PageContentContext* cxt = pdfWriter.StartPageContentContext(page);
cxt->DrawImage(10, 10, “D:\sign.png”);
pdfWriter.EndPageContentContext(cxt);
pdfWriter.WritePage(page);delete page;
ret=pdfWriter.EndPDF();
if (ret == eSuccess)
{std::cout << "EndPDF Success" << std::endl;
}
}

可以看出来图像嵌入pdf,尺寸过于大了并未显示全
4.缩放图像
#include
#include “PDFWriter.h”//核心
#include “PDFPage.h”//页面
#include “PageContentContext.h”//上下文
int main()
{
std::cout << “Hello World!\n”;
PDFWriter pdfWriter;
int ret=pdfWriter.StartPDF(“D:\mytestwriterpdf.pdf”, ePDFVersion13);
if (ret == eSuccess)
{
std::cout << “StartPDF Success” << std::endl;
}
else
{
return -1;
}
PDFPage* page = new PDFPage();
//将"媒体框"设置为A4 //请注意,PDF 页面具有比媒体框更多的框定义。PDF 定义了裁剪框、出血框、修剪框和艺术框。您可以分别使用 SetCropBox、SetBleedBox、SetTrimBox和SetArtBox来设置这些框。SetCropBoxSetBleedBoxSetTrimBoxSetArtBox
page->SetMediaBox(PDFRectangle(0, 0, 595, 842));
PageContentContext* cxt = pdfWriter.StartPageContentContext(page);
//AbstractContentContext::ImageOptions opt;
//opt.transformationMethod = AbstractContentContext::eMatrix;
//opt.matrix[0] = opt.matrix[3] = 0.25;
//opt.matrix[4] = opt.matrix[5] = 100;
//cxt->DrawImage(10, 10, “D:\sign.png”,opt);
AbstractContentContext::ImageOptions opt2;
opt2.transformationMethod = AbstractContentContext::eFit;
opt2.boundingBoxHeight = 100;
opt2.boundingBoxWidth = 100;
opt2.fitProportional = true;
cxt->DrawImage(500,700,“D:\sign.png”,opt2);
pdfWriter.EndPageContentContext(cxt);pdfWriter.WritePage(page);delete page;
ret=pdfWriter.EndPDF();
if (ret == eSuccess)
{std::cout << "EndPDF Success" << std::endl;
}
}

正常使用时要判断创建是否成功,再继续操作
获取图像测量值
有时您可能需要图像测量。对于库支持的图像,可以使用 的方法。例如:GetImageDimensionsPDFWriter
DoubleAndDoublePair jpgDimensions = pdfWriter.GetImageDimensions(“soundcloud_logo.jpg”);
jpgDimensions现在将有一对。第一对是宽度,第二是高度。
写入文字
PDFUsedFont* font = pdfWriter.GetFontForFile(“D:\simsun.ttc”);
AbstractContentContext::TextOptions textOptions(font,14,AbstractContentContext::eGray,0);
cxt->WriteText(10, 700, “Hello World”, textOptions);
输入中文时,PDF中并未打印出中文。
用notepad打开Cpp文件,是utf8格式没错。但是在调试时发现库解析时识别为两个字节的编码了。
如果以UTF-8,那么中文会以类似3个字节保存一个中文的形式保存到磁盘,而使用GBK中文是以类似2个字节保存一个中文的形式保存到磁盘,这叫编码,也叫做保存编码。
增加了GBKtoUtf8,成功显示出来了
5.打开一个已经存在的PDF文件,修改他的某一页
int main()
{
PDFWriter pdfWriter;
pdfWriter.ModifyPDF(“d:\test.pdf”, ePDFVersion13, “”);
PDFModifiedPage modifiedPage(&pdfWriter, 1);
AbstractContentContext* contentContext = modifiedPage.StartContentContext();
AbstractContentContext::ImageOptions opt2;
opt2.transformationMethod = AbstractContentContext::eFit;
opt2.boundingBoxHeight = 100;
opt2.boundingBoxWidth = 100;
opt2.fitProportional = true;
contentContext->DrawImage(100,700,"D:\\sign.png",opt2);modifiedPage.EndContentContext();
modifiedPage.WritePage();
pdfWriter.EndPDF();
}
以上是功能测试部分,可以看出PDFWriter的功能还是比较全面的,API也比较简单。
下一篇:用QT编写一个PDF编辑器
相关文章:
C++编辑修改PDF
PDFWriter是一个易于使用的C创建、修改PDF文档的库 1.创建一个PDF文件 #include #include “PDFWriter.h” int main() { std::cout << “Hello World!\n”; PDFWriter pdfWriter; int retpdfWriter.StartPDF(“D:\mytestwriterpdf.pdf”, ePDFVersion13); if (ret eS…...
数据倾斜优化
数据倾斜发生的原因有哪些? map输出数据按key Hash的分配到reduce中,由于key分布不均匀、业务数据本身的特性、建表时考虑不周等原因造成的reduce 上的数据量差异过大。 数据倾斜解决方式有哪些 group by 导致的数据倾斜 1.开启Map-Side聚合后&#x…...
Acwing796.子矩阵的和
理解二维前缀和: #include <iostream>using namespace std;const int N 1010;int a[N][N], s[N][N];int main() {int n, m, q;cin >> n >> m >> q;for (int i 1; i < n; i)for (int j 1; j < m; j) {scanf("%d", &a…...
【ELK日志收集系统】
目录 一、概述 1.作用 2.为什么使用? 二、组件 1.elasticsearch 1.1 作用 1.2 特点 2.logstash 2.1 作用 2.2 工作过程 2.3 INPUT 2.4 FILETER 2.5 OUTPUTS 3.kibana 三、架构类型 1.ELK 2.ELKK 3.ELFK 4.ELFKK 四、案例 - 构建ELK集群 1.环境…...
Java项目中实现信号的连续接收
系列文章目录 文章目录 系列文章目录前言一、监听信号二、信号处理逻辑三、停止信号监听总结 前言 在Java项目中,信号的连续接收是一项重要的任务,特别是在处理异步事件或者需要对外部事件做出响应时。本篇博客将介绍如何在Java项目中实现信号的连续接收…...
vue权限管理——按钮控制
1.按钮根据后端返回数据决定展示与否 根据right中的数据对应增删改查按钮 const menuList [{id: 1, path:/uploadSpec,authName: "上传spec", icon: User, children:[], rights:[view,add,edit,delete]},{id: 2, path:/showSpec, authName: "Spec预览",…...
jvm的内存区域
JVM 内存分为线程私有区和线程共享区,其中方法区和堆是线程共享区,虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。 1)程序计数器 程序计数器(Program Counter Register)也被称为 PC 寄存器,是一块…...
即时通讯开发中的性能优化技巧
即时通讯开发在如今的数字化社会中扮演着重要角色,然而,随着用户对即时通讯应用的需求不断增长,开发者们面临着使其应用保持高性能和可靠性的挑战。本文将探讨即时通讯开发中关键的性能优化技巧,帮助开发者们提升应用的用户体验和…...
flinkcdc同步完全量数据就不同步增量数据了
flinkcdc同步完全量数据就不同步增量数据了 使用flinkcdc同步mysql数据,使用的是全量采集模型 startupOptions(StartupOptions.earliest()) 全量阶段同步完成之后,发现并不开始同步增量数据,原因有以下两个: 原因1: …...
VBA:Application.GetOpenFilename打开指定文件夹里的excel类型文件(xls、xlsx)
GetOpenFilename相当于Excel打开窗口,通过该窗口选择要打开的文件,并可以返回选择的文件完整路径和文件名。 Application.GetOpenFilename(“文件类型筛选规则(就是说明)”,“优先显示第几个类型的文件”,“标题”,“是否允许选择多个文件名”) 打开类型…...
利用R作圆环条形图
从理念上看,本质就是增加了圆环弧度的条形图。如上图2。 需要以下步骤: 数据处理,将EXCEL中的数据做成3*N的表格导入系统,代码如下:library(tidyverse) library(stringr)library(ggplot2)library(viridis) stuper &…...
JavaScript(笔记)
目录 Hello World JavaScript 的变量 JavaScript 动态类型 隐式类型转换 JavaScript 数组 JavaScript 函数 JavaScript 中变量的作用域 对象 DOM 选中页面元素 事件 获取 / 修改元素内容 获取 / 修改元素属性 获取 / 修改 表单元素属性 获取 / 修改样式属性 新…...
软件工程(九) UML顺序-活动-状态-通信图
顺序图和后面的一些图,要求没有用例图和类图那么高,但仍然是比较重要的,我们也需要按程度去了解。 1、顺序图 顺序图(sequence diagram, 顺序图),顺序图是一种交互图(interaction diagram),它强调的是对象之间消息发送的顺序,同时显示对象之间的交互。 下面以一个简…...
JVM 是怎么设计来保证new对象的线程安全
1、采用 CAS 分配重试的方式来保证更新操作的原子性 2、每个线程在 Java 堆中预先分配一小块内存,也就是本地线程分配缓冲(Thread Local AllocationBuffer,TLAB),要分配内存的线程,先在本地缓冲区中分配&a…...
【JavaEE基础学习打卡00】该专栏知识大纲在这里!
目录 前言一、为什么有该教程二、教程内容介绍1.JavaEE2.JDBC3.JSP编程4.JavaBean5.Servlet6.综合案例7.拦截器、过滤器 三、学习前置要求四、课程服务总结 前言 📜 本系列教程适用于 Java Web 初学者、爱好者,小白白。我们的天赋并不高,可贵…...
C# 跨线程访问窗体控件
在不加任何修饰的情况下,C# 默认不允许跨线程访问控件,实际在项目开发过程中,经常使用跨线程操作控件属性,需要设置相关属性才能正确使用,两种方法设置如下: 方法1:告诉编译器取消跨线程访问检…...
Ctenos7安装mysql-8.1.0/tomcat-9.0.80/LNMT部署
目录 一、实验拓扑 二、部署mysql 三、部署Tomcat 四、配置NGINX 五、 配置NGINX的双机热备提高可用性 一、实验拓扑 二、部署mysql 官网下载地址https://dev.mysql.com/downloads/mysql/ 1、移除mariadb,安装所需应用 mysql-8.1.0 社区版 安装说明官网下载地址…...
input时间表单默认样式修改(input[type=“date“])
一、时间选择的种类: HTML代码: <input type"date" value"2018-11-15" />选择日期: 选择时间: <input type"time" value"22:52" />在这里插入图片描述 选择星期: <…...
首页搜索框传递参数,并在搜索页面中的搜索框中进行显示,搜索框绑定回车键进行搜索
实现搜索条件和搜索内容固定,以及回车键搜索跳转 1.写出搜索条件和搜索框 <form class"parent"><select id"searchSelect" style"border: 1px solid #325da7;border-right: none;" value"resource"><opt…...
【Vue3+Ts】项目启动准备和配置项目代码规范和css样式的重置
项目启动准备 创建项目( 使用Vite 构建工具创建项目模板)目录介绍插件安装创建别名编译说明项目配置配置icon和标题配置项目别名配置ts.config.json检测vscode的插件是否配置 配置项目代码规范集成editorconfig配置prettier工具库ESLint检测配置 CSS样式…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
