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);
            }
        }
    
    }
    
  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/seliote/p/12142289.html
Copyright © 2011-2022 走看看