zoukankan      html  css  js  c++  java
  • Winform PDF 提取图片

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Drawing;
    using System.IO;
    using System.Windows.Forms;
    using iTextSharp.text.pdf;
    
    namespace PrintHelper
    {
        public partial class EntryPoint : Form
        {
            // 长度与宽度同时小于下面值的图片将被忽略
            private static int IGNORE_LIMIT_HEIGHT = 300;
            private static int IGNORE_LIMIT_WIDTH = 300;
    
            public EntryPoint()
            {
                InitializeComponent();
            }
    
            private void SelectFileButton_Click(object sender, EventArgs e)
            {
                // 桌面路径
                String desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
                // 打开文件选择窗口
                String selectedFile = OpenSelectFileDialog(desktopPath, "PDF文件|*.pdf");
                // 没选文件就关了窗口
                if (selectedFile == null)
                {
                    Close();
                }
                // 输出路径
                String outputDir = desktopPath + "\" + Path.GetFileNameWithoutExtension(selectedFile);
                // 解析图片
                List<Image> images = getAllImageFromPdf(selectedFile);
                // 输出图片
                saveImages(outputDir, images);
                // 打开输出目录
                openFileExplore(outputDir);
                // 关闭该窗体
                Close();
            }
    
            /// <summary>
            /// 打开文件选择窗口
            /// </summary>
            /// <param name="baseDir">默认显示的文件夹</param>
            /// <param name="filterPattern">文件的过滤方式</param>
            /// <returns>选择的文件</returns>
            private String OpenSelectFileDialog(String baseDir, String filterPattern)
            {
                OpenFileDialog dialog = new OpenFileDialog();
                dialog.Title = "请选择文件";
                dialog.InitialDirectory = baseDir;
                dialog.Filter = filterPattern;
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    return dialog.FileName;
                }
                else
                {
                    return null;
                }
            }
    
            /// 按顺序解析出 PDF 中的图片
            /// </summary>
            /// <param name="filePath">需要解析的文件路径</param>
            /// <returns>图片的 List</returns>
            private List<Image> getAllImageFromPdf(String filePath)
            {
                List<Image> images = new List<Image>();
                RandomAccessFileOrArray randomAccessFileOrArray = null;
                try
                {
                    randomAccessFileOrArray = new RandomAccessFileOrArray(filePath);
                    PdfReader pdfReader = new PdfReader(randomAccessFileOrArray, null);
                    for (int i = 0; i < pdfReader.XrefSize; ++i)
                    {
                        PdfObject pdfObject = pdfReader.GetPdfObject(i);
                        if (pdfObject != null && pdfObject.IsStream())
                        {
                            PdfStream pdfStream = (PdfStream)pdfObject;
                            PdfObject subPdfObject = pdfStream.Get(PdfName.SUBTYPE);
                            if (subPdfObject != null && subPdfObject.ToString() == PdfName.IMAGE.ToString())
                            {
                                byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)pdfStream);
                                if (bytes != null)
                                {
                                    MemoryStream memoryStream = new MemoryStream(bytes);
                                    images.Add(Image.FromStream(memoryStream));
                                    memoryStream.Close();
                                }
                            }
                        }
                    }
                }
                finally
                {
                    if (randomAccessFileOrArray != null)
                    {
                        randomAccessFileOrArray.Close();
                    }
                }
                return images;
            }
    
            /// <summary>
            /// 输出图片
            /// </summary>
            /// <param name="targetDir"></param>
            /// <param name="images"></param>
            private void saveImages(String targetDir, List<Image> images)
            {
                // 删掉旧的创建新的
                if (Directory.Exists(targetDir))
                {
                    // 递归删除
                    Directory.Delete(targetDir, true);
                }
                Directory.CreateDirectory(targetDir);
                int count = 0;
                foreach (Image image in images)
                {
                    // 小于最小尺寸直接忽略
                    if (image.Width <= IGNORE_LIMIT_WIDTH && image.Height <= IGNORE_LIMIT_HEIGHT)
                    {
                        continue;
                    }
                    // 直接保存会报错,似乎是对象引用持有问题
                    using (Bitmap bitmap = new Bitmap(image))
                    {
                        bitmap.Save(targetDir + "\" + (++count) + ".jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
                    }
                }
            }
    
            /// <summary>
            /// 以指定路径打开文件资源管理器
            /// </summary>
            /// <param name="path"></param>
            private void openFileExplore(String path)
            {
                Process.Start("explorer.exe", path);
            }
        }
    
    }
    
  • 相关阅读:
    HTML CSS整理笔记
    2020软件工程最后一次作业
    form表单的基本用法
    图片预加载和懒加载(2)——懒加载
    ES6——promise基础
    图片预加载和懒加载(2)——预加载
    图片预加载和懒加载(1)
    js时间——转换为我们需要的格式
    原生js瀑布流
    富文本——小程序中使用特殊符号及标签
  • 原文地址:https://www.cnblogs.com/seliote/p/12142289.html
Copyright © 2011-2022 走看看