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);
}
}
}
Winform PDF 提取图片
猜你喜欢
转载自www.cnblogs.com/seliote/p/12142289.html
今日推荐
周排行