//
// Created by svenj on 2019/2/3.
// extern "C" {
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
} #include <fpdfview.h>
#include <fpdf_save.h>
#include "util.hpp" struct PdfToFdWriter : FPDF_FILEWRITE {
int dstFd;
}; static bool writeAllBytes(const int fd, const void *buffer, const size_t byteCount) {
char *writeBuffer = static_cast<char *>(const_cast<void *>(buffer));
size_t remainingBytes = byteCount;
while (remainingBytes > 0) {
ssize_t writtenByteCount = write(fd, writeBuffer, remainingBytes);
if (writtenByteCount == -1) {
if (errno == EINTR) {
continue;
}
LOGE("Error writing to buffer: %d", errno);
return false;
}
remainingBytes -= writtenByteCount;
writeBuffer += writtenByteCount;
}
return true;
} static int writeBlock(FPDF_FILEWRITE* owner, const void* buffer, unsigned long size) {
const PdfToFdWriter* writer = reinterpret_cast<PdfToFdWriter*>(owner);
const bool success = writeAllBytes(writer->dstFd, buffer, size);
if (success < 0) {
LOGE("Cannot write to file descriptor. Error:%d", errno);
return 0;
}
return 1;
} JNI_FUNC(jboolean, PdfWriter, nativeWrite)(JNI_ARGS, jlong docPtr, jint fd) {
auto document = reinterpret_cast<FPDF_DOCUMENT>(docPtr);
PdfToFdWriter writer;
writer.dstFd = fd;
writer.WriteBlock = &writeBlock;
FPDF_BOOL success = FPDF_SaveAsCopy(document, &writer, FPDF_NO_INCREMENTAL);
if (!success) {
jniThrowExceptionFmt(env, "java/io/IOException",
"cannot write to fd. Error: %d", errno);
}
}

  

pdfium 保存pdf的更多相关文章

  1. 在Adobe Reader中保存PDF表单数据的方法

    通常,Adobe Reader 用户填写表单后,是无法保存所填表单的副本的.但是,对于 Reader 8 和更高版本的用户,您可以扩展其权限,使他们可以完成此操作.如果您使用的是 Acrobat Pr ...

  2. 如何保存PDF、Word和Excel文件到数据库中

    在项目中,有时候我们很需要把PDF.Word和Excel文档等等上传到数据库,以便日后使用.今天这篇文章向大家讲解如何将这些文件保存到数据库的. 详细步骤 第一步:打开数据库,单击新建查询,创建一个名 ...

  3. [Q]AdobePDF虚拟打印机自动保存PDF

    使用打图精灵打印时,选择“Adobe PDF”虚拟打印机打印(注意不选择“打印到文件”),每张图纸都会弹出一个保存对话框,如何避免? 从 操作系统->控制面板->硬件和声音->设备和 ...

  4. 使用pdfbox分页保存pdf为图片

    一.背景 pdfbox作为Apache开源的PDF操作工具,允许创建新的PDF文档,操作现有文档,以及从文档中提取内容的能力.Apache PDFBox还包括一些命令行实用工具.本文楼主主要介绍其中的 ...

  5. [R] venn.diagram保存pdf格式文件?

    vennDiagram包中的主函数绘图时,好像不直接支持PDF格式文件: dat = list(a = group_out[[1]][,1],b = group_out[[2]][,1]) names ...

  6. Swift 保存pdf并在webview显示

    本例中服务器返回的是base64 字符串,也可以直接返回byte[],看server接口的定义 let nsData = NSData(base64Encoded: data!!) 拿到nsData以 ...

  7. 将HTML页面自动保存为PDF文件并上传的两种方式(一)-前端(react)方式

    一.业务场景 公司的样本检测报告以React页面的形式生成,已调整为A4大小的样式并已实现分页,业务上需要将这个网页生成PDF文件,并上传到服务器,后续会将这个文件发送给客户(这里不考虑). 二.原来 ...

  8. Microsoft.Office.Interop.Excel的用法以及利用Microsoft.Office.Interop.Excel将web页面转成PDF

    1.常见用法           using Microsoft.Office.Interop.Excel; 1)新建一个Excel ApplicationClass ExcelApp = New A ...

  9. 使用免费组件view pdf 文档

    “Is there any way to view PDF files in a Winforms tool?” 这个是我在技术论坛上发现的一个老外求助的帖子,然后看到别人回复的帖子中建议了一个免费的 ...

随机推荐

  1. 攻防世界web之PHP2

    题目 御剑扫描无果,源码也无发现 但是在url后面添加index.phps发现代码泄露 右击查看源码 审计代码 首先不能admin等于get传过来的值 又要使admin等于get传值 在get传值之前 ...

  2. lua 2 变量

    变量在使用前,必须在代码中进行声明,即创建该变量. 编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值. Lua 变量有三种类型:全局变量.局部变量.表中的域. Lua 中的 ...

  3. Python process (进程)

    进程 (process) 进程是对各种资源管理的集合,包含对各种资源的调用.内存的管理.网络接口的调用 进程要操作 CPU 必须先启动一个线程,启动一个进程的时候会自动创建一个线程,进程里的第一个线程 ...

  4. CF92B-Binary Number-(思维)

    https://vjudge.net/problem/CodeForces-92B 题意:给一个长度为106的二进制数,有两种操作,第一种是除以2,第二种是末尾+1,以二进制运算,问这个二进制数最少几 ...

  5. linux 下安装 python ngix 项目发布流程

    1.安装python #1.安装python3.7所需要的依赖包yum -y groupinstall "Development tools"yum -y install zlib ...

  6. 8.Go-Reader,Writer和ioutil

    8.1.Reader (1)输入流 流是应用程序和外部资源进行数据交互的纽带 流分为输入流和输出流,输入和输出都是相对于程序,把外部数据传入程序中叫做输入流,反之叫做输出流 在Go语言标准库中io包下 ...

  7. Spring Cloud Alibaba Sentinel对RestTemplate的支持

    Spring Cloud Alibaba Sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,在构造 RestTemplate bean的时候需要加上 @S ...

  8. PS快速去除水印方法

    步骤 第一步:打开PS软件,鼠标左键单击左上角"文件"-"打开",选择一张图片 第二步:鼠标左键单击左边的工具栏"矩形选框工具" 第三步:鼠 ...

  9. python命令行解析函数

    sys.argv 在终端运行python 1.py hahah import sys print(sys.argv) # ['1.py', 'hahah'] argparse Python的命令行解析 ...

  10. 转载-Qualcomm MSM8953启动流程:PBL-SBL1-(bootloader)LK-Android

    文章转载链接: https://blog.csdn.net/RadianceBlau/article/details/73229005 对于嵌入式工程师了解芯片启动过程是十分有必要的,在分析.调试各种 ...