itext7 pdf转图片

https://github.com/thombrink/itext7.pdfimage

新建asp.net core8项目,安装itext7和system.drawing.common

引入itext.pdfimage核心代码

imageListener下有一段不安全的代码

cs 复制代码
  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
          }
      }
  }

修改为安全代码

cs 复制代码
// 遍历每一行  
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);  
}  

调用

cs 复制代码
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!");
    }
}
相关推荐
m0_7482412313 小时前
ElasticPDF-新国产 PDF 编辑器开发框架(基于 pdf.js Web PDF批注开发,实现高亮多边形橡皮擦历史记录保存注释文字)
前端·pdf·编辑器
ComPDFKit14 小时前
开源 JS PDF 库比较
pdf
杨浦老苏14 小时前
开源PDF翻译工具PDFMathTranslate
人工智能·docker·ai·pdf·群晖·翻译
LostSpeed18 小时前
在福昕(pdf)阅读器中导航到上次阅读页面的方法
pdf
旭久18 小时前
SpringBoot的Thymeleaf做一个可自定义合并td的pdf表格
pdf·html·springboot
神色自若2 天前
Net9为PDF文字替换,使用Spire.PDF版本10.12.4.1360
pdf
机器懒得学习2 天前
解析交通事故报告:利用 PDF、AI 与数据标准化技术构建智能分析系统
pdf
合合技术团队2 天前
高效准确的PDF解析工具,赋能企业非结构化数据治理
人工智能·科技·pdf·aigc·文档
jingling5552 天前
如何使用免费资源--知网篇
开发语言·经验分享·搜索引擎·pdf·开源
haha_qasim3 天前
怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法
前端·pdf