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);
        }
    }

}

猜你喜欢

转载自www.cnblogs.com/seliote/p/12142289.html