itext7 pdf转图片

https://github.com/thombrink/itext7.pdfimage
新建asp.net core8项目,安装itext7和system.drawing.common
在这里插入图片描述
引入itext.pdfimage核心代码
在这里插入图片描述
imageListener下有一段不安全的代码

  unsafe
  {
      for (int y = 0; y < image.Height; y++)
      {
          byte* ptrMask = (byte*)bitsMask.Scan0 + y * bitsMask.Stride;
          byte* ptrInput = (byte*)bitsInput.Scan0 + y * bitsInput.Stride;
          byte* ptrOutput = (byte*)bitsOutput.Scan0 + y * bitsOutput.Stride;
          for (int x = 0; x < image.Width; x++)
          {
              ptrOutput[4 * x] = ptrInput[4 * x];           // blue
              ptrOutput[4 * x + 1] = ptrInput[4 * x + 1];   // green
              ptrOutput[4 * x + 2] = ptrInput[4 * x + 2];   // red
              ptrOutput[4 * x + 3] = ptrMask[4 * x];        // alpha
          }
      }
  }

修改为安全代码

// 遍历每一行  
for (int y = 0; y < image.Height; y++)  
{  
    // 计算每行的起始字节位置  
    int scanOffsetInput = y * bitsInput.Stride;  
    int scanOffsetMask = y * bitsMask.Stride;  
    int scanOffsetOutput = y * bitsOutput.Stride;  

    // 获取当前行的字节数组  
    byte[] scanlineInput = new byte[bitsInput.Stride];  
    byte[] scanlineMask = new byte[bitsMask.Stride];
    byte[] scanlineOutput = new byte[bitsOutput.Stride];
    Marshal.Copy(bitsInput.Scan0 + scanOffsetInput, scanlineInput, 0, scanlineInput.Length);  
    Marshal.Copy(bitsMask.Scan0 + scanOffsetMask, scanlineMask, 0, scanlineMask.Length);  

    // 遍历每一列(或每一像素)  
    for (int x = 0; x < image.Width; x++)  
    {  
        // 计算当前像素在字节数组中的位置(基于每个像素4个字节)  
        int pixelOffsetInput = x * 4;  
        int pixelOffsetMask = x * 4;  
        int pixelOffsetOutput = x * 4;  

        // 读取输入图像的RGB值  
        byte blue = scanlineInput[pixelOffsetInput];  
        byte green = scanlineInput[pixelOffsetInput + 1];  
        byte red = scanlineInput[pixelOffsetInput + 2];  

        // 读取遮罩图像的alpha值  
        byte alpha = scanlineMask[pixelOffsetMask];  

        // 将值写入输出图像的对应位置  
        scanlineOutput[pixelOffsetOutput] = blue;  
        scanlineOutput[pixelOffsetOutput + 1] = green;  
        scanlineOutput[pixelOffsetOutput + 2] = red;  
        scanlineOutput[pixelOffsetOutput + 3] = alpha;  
    }  

    // 将处理过的行复制回输出图像的BitmapData中  
    Marshal.Copy(scanlineOutput, 0, bitsOutput.Scan0 + scanOffsetOutput, scanlineOutput.Length);  
}  

调用

using System.Drawing.Imaging;
using iText.Kernel.Pdf;
using itext.pdfimage.Extensions;

namespace pdf2image02;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Start Bliep");
        var pdfPath = "D:\\ChatFiles\\WechatWorkFile\\WXWork\\1688853272898895\\Cache\\File\\2024-04\\wave.pdf";

        var pdf = File.Open(pdfPath, FileMode.Open);

        var reader = new PdfReader(pdf);
        var pdfDocument = new PdfDocument(reader);
        var bitmaps = pdfDocument.ConvertToBitmaps();

        foreach (var bitmap in bitmaps)
        {
            bitmap.Save(Path.Combine("F:\\Desktop\\test\\aa", $"wave-{DateTime.Now.Ticks}.png"), ImageFormat.Png);
            bitmap.Dispose();
        }

        var page1 = pdfDocument.GetPage(1);
        var bitmap1 = page1.ConvertPageToBitmap();
        bitmap1.Save(Path.Combine("F:\\Desktop\\test\\aa", $"wave-page1-{DateTime.Now.Ticks}.png"), ImageFormat.Png);
        bitmap1.Dispose();

        Console.WriteLine("End Bliep!");
    }
}

在这里插入图片描述

20240413接入最新版的itext7也是可以的
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/540783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

B站大数据平台元数据业务分享

背景介绍 元数据是数据平台的衍生数据&#xff0c;比如调度任务信息&#xff0c;离线hive表&#xff0c;实时topic&#xff0c;字段信息&#xff0c;存储信息&#xff0c;质量信息&#xff0c;热度信息等。在数据平台建设初期&#xff0c;这类数据主要散落于各种平台子系统的数…

STM32H7的Cache学习和应用

STM32H7的Cache学习和应用 啥是Cache&#xff1f;Cache的配置配置 Non-cacheable配置 Write through&#xff0c;read allocate&#xff0c;no write allocate配置 Write back&#xff0c;read allocate&#xff0c;no write allocate配置 Write back&#xff0c;read allocate…

05 SQL进阶 -- 复杂查询方法 -- 视图与子查询

1. 视图 我们先来看一个查询语句 SELECT stu_name FROM view_students_info; 单从表面上看起来这个语句是和正常的从数据表中查询数据是完全相同的,但其实我们操作的是一个视图。所以从SQL的角度来说操作视图与操作表看起来是完全相同的,那么为什么还会有视图的存在呢?视…

002nodejs详细安装步骤和npm配置

1、Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。Node.js 使用高效、轻量级的事件驱动、非阻塞 I/O 模型。它的包生态系统&#xff0c;npm&#xff0c;是目前世界上最大的开源库生态系统。 2、下载Node.js 官方地址&#xff1a;https://nodejs.org/…

2024年阿里云服务器新购、续费、升级优惠活动和价格表

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

SAFe认证Leading SAFe官方认证班/Leading SAFe领导大规模敏捷认证课

课程简介 SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架&#xff0c;也是全球敏捷相关认证成长最快、最被认可、最有价值的规模化敏捷认证&#xff0c;目前全球SAFe认证专业人士已达120万人。 据官方统计&#xff0c;获得新证书的IT专业人士的平均工资…

Linux 系统下对于 MySQL 的初级操作

由于公司老板想把早已封存的服务器陈年老码捣鼓一下&#xff0c;所以找了一个外援&#xff0c;我则是配合提供支持。但是过程并不顺利。至少 5 年以上的间隔&#xff0c;导致外援查看的时候发现很多代码和配置是缺失的&#xff0c;目前卡在数据库部分&#xff0c;而我这边就帮忙…

CorelDRAW2024绿色精简汉化版本安装包下载

CorelDRAW是一款由加拿大Corel公司开发的平面设计软件&#xff0c;主要用于矢量图形制作、排版和编辑。它以其强大的功能和用户友好的界面而广受欢迎&#xff0c;被广泛应用于各个领域&#xff0c;包括设计、广告、出版和印刷等。 CDR2017-2024全版本下载网盘汉化版链接: http…

【RK3399】Ubuntu系统,HDMI输出固定分辨率

在linux系统目录下&#xff1a;/usr/share/X11/xorg.conf.d&#xff0c;新增 screen-resolution.conf文件。 在改文件中添加&#xff1a; Section "Monitor"Identifier "HDMI-1"Option "Primary" "true"Modeline "1280x800_60.0…

区块链游戏:探索未来的可能性与挑战

区块链游戏是一种将区块链技术应用于游戏领域的创新产品&#xff0c;它为游戏行业带来了全新的模式和可能性。本文将深入探讨区块链游戏的优点、挑战和未来趋势&#xff0c;帮助读者了解这一新兴领域。 一、区块链游戏的优点 1. 公平性&#xff1a;区块链技术保证了游戏中的物…

隐式转换和强制转换

一.前言: 数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算 二.取值范围 byte-------->short--------------->int------------->long------------------>float----------->double 三.隐式转换 1.概念 把取值范围小的数值转换成取值范围大的数…

在 Next.js App Router 中使用仅在服务端的代码

React Server Components 架构将组件分为客户端和服务端类型&#xff0c;并与 Next.js 的 App Router 集成。 使用 App Router 进行开发时&#xff0c;区分服务端代码和客户端代码对于应用程序的安全性、性能和可维护性至关重要。这篇博文将介绍在 Next.js 应用程序中定义服务…

【前缀合】Leetcode 连续数组

题目解析 525. 连续数组 寻找一个子数组&#xff0c;这个子数组中包含相同数目的0和1&#xff0c;但是这个子数组需要最长的 算法讲解 只需在[0,i]寻找一段区间使得这一段区间的和也等于sum即可 细节问题&#xff1a;1. 这里的哈希表的value存的是下标&#xff0c;因为需要找…

C++STL(stack类、queue类)

文章目录 1.stack类和queue类的介绍2.stack类和queue类的基本用法2.1 (stack)下列代码的运行结果是&#xff08; &#xff09;2.2 (queue)下列代码的运行结果是&#xff08; &#xff09; 3.stack类和queue类的底层(模拟实现)3.1 deque类(双端队列)3.2 适配器模式3.3 stack类的…

python创建word文档并向word中写数据

一、docx库的安装方法 python创建word文档需要用到docx库&#xff0c;安装命令如下&#xff1a; pip install python-docx 注意&#xff0c;安装的是python-docx。 二、使用方法 使用方法有很多&#xff0c;这里只介绍创建文档并向文档中写入数据。 import docxmydocdocx.Do…

CSS导读 (复合选择器 上)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二、CSS的复合选择器 2.1 什么是复合选择器 2.2 后代选择器(重要) 2.3 子选择器(重要) Questions 小提…

【CSS基础】9.形变transform

1. transform介绍 CSS transform属性允许对某个一个元素进行形变&#xff0c;包括旋转、位移、缩放、倾斜等并非所有的盒子都可以形变&#xff08;通常来说行内级盒子不能进行形变&#xff09; 2. transform的用法 transform可以增加多个transform function&#xff0c;通过空…

短视频转gif怎么做?三十秒在线转换gif

在现在这个快节奏的时代&#xff0c;gif动画相较于长时间的视频更受大众的欢迎。当我们需要将短视频、电影等视频制作成gif动画图片的时候就可以使用gif动画图片&#xff08;https://www.gif.cn/&#xff09;制作网站-GIF中文网&#xff0c;无需下载软件&#xff0c;手机、pc均…

K8s 命令行工具

文章目录 K8s 命令行工具kubectl 工具在任意节点使用kubectl方式创建对象命令显示和查找资源更新资源修补资源编辑资源Scale 资源删除资源查看pod信息节点相关操作 K8s 命令行工具 在搭建集群的时候&#xff0c;我们通过yum 下载了kubeadm kubelet kubectl 三个命令行工具&…

C 语言贪吃蛇源码解析

贪吃蛇是一款经典的电子游戏&#xff0c;玩家控制一条不断成长的蛇&#xff0c;需要避免撞到自己的身体或者游戏边界&#xff0c;同时吃掉出现在屏幕上的食物以增长身体长度。 下面是一个简单的贪吃蛇游戏的C语言实现&#xff0c;使用了标准输入输出库conio.h和时间库windows.h…