65.9K
CodeProject 正在变化。 阅读更多。
Home

从 PDF 文档中提取图像

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2012 年 9 月 1 日

CPOL

5分钟阅读

viewsIcon

35112

PDF 格式是当今世界广泛使用的文档交换媒介。PDF 文件非常适合在所有平台和互联网上保存和交换文件。本文档重点介绍如何使用 PDF Xpress 从这些 PDF 文档中提取图像。

PDF 格式是当今世界广泛使用的文档交换媒介。PDF 文件非常适合在所有平台和互联网上保存和交换文件。本文档重点介绍如何使用 PDF Xpress 从这些 PDF 文档中提取图像。在某些情况下,您可能需要从 PDF 文件中提取图像以用于网页、文字处理文档、PowerPoint 演示文稿等。例如,当源图像文件不再可用时,您可能需要在 PDF 中的图像在另一个文档中重用。

PDF 文档的页面由许多不同类型的对象组成,例如剪切路径、附件、视频、音频文件、图像等。在 PDF 领域,图像是通过扫描图像阵列时按行或列顺序获得的样本序列定义的。PDF 软件的一个流行功能是提取图像的能力。这些图像通常保存到磁盘或内存中的图像文件格式。

当今市场上存在许多 PDF 图像提取应用程序,但质量并非它们的长项。许多应用程序是使用开源 PDF 库编写的,这些库通常可以完成任务,但往往以牺牲准确性为代价。借助 PDF Xpress,开发人员可以在其产品中添加可靠、快速且全面的图像提取功能。此外,通过与其他 Accusoft 产品(如 ImagXpress)结合使用,用户可以将提取的图像保存到各种格式,包括 JPEG-XR、JPEG 2000、GIF、TIFF、PNG 等。

事情没那么简单

网上(例如博客)存在一种普遍的误解,认为图像文件是完整地插入到 PDF 中的(这仅适用于附件的情况),而只需找到该文件并提取它即可。情况并非如此。

例如,PDF 中使用的一种流行过滤器是 DCTDecode 过滤器(离散余弦变换用于编码 JPG 图像)。因此,人们常常会错误地将此 DCTDecode 流数据作为一个整体进行提取,并将其保存为扩展名为 .JPG 的文件。有时,与原始 PDF 相比,图像看起来似乎是正确的。这只有在 Image XObject 的 BitsPerComponent 值为 8、ColorSpace 值为 DeviceRGB,并且指定了非默认的 Decode 数组值时才可能。例如,如果使用其他 ColorSpace,则简单地提取图像数据是不正确的,也不是正确的解决方案。

PDF 图像数据

PDF 仅包含原始图像数据,没有格式,没有标题等。此外,数据是根据指定的颜色空间来表示的,因此软件需要将这些数据以一种对输出格式有意义的方式组合起来。例如,如果图像数据是在 Lab 颜色空间中指定的,您不能直接将其保存到 TIFF。PDF 支持多种颜色空间,如 Lab、CalRGB、ICCBased、DeviceCMYK、Separation 等。这种图像数据很难在大多数图像格式中表达,因此需要将数据转换为另一种可被格式理解的颜色空间。PDF Xpress 将数据以 Bitmap (BMP) 格式提供给您,这是一种无损格式,因此不会丢失任何信息,并且可以灵活地将图像数据保存到您选择的任何格式。

其他解决方案的不足之处

PDF 图像提取软件的一个常见弱点在于处理使用 DeviceCMYK ColorSpace 的图像。通常情况下,它处理不当,甚至根本不处理。它常常使用一种简单的数值转换将数据转换为 RGB 颜色空间,这通常会导致图像颜色褪色,仅仅是对原始图像的粗略近似。PDF Xpress 使用色彩管理来正确转换这些图像。

一些 PDF 软件声称以其原生格式提取图像数据,其中一种声称的格式是 TIFF。问题在于 PDF 中不存在 TIFF 这种格式。CCITTFaxDecode 是 PDF 中用于压缩图像流的过滤器,这种压缩类型常用于二值 TIFF 图像,但它只是一个数据块;它不是一个实际的 TIFF 文件。因此,TIFF 文件和 CCITT 压缩的数据块并非同一事物。

许多提取工具生成的输出文件会损坏、颜色不正确、在页面上完全跳过图像、无法处理安全文档,或者只返回部分图像。PDF Xpress 可以正确提取所有 Image XObjects,并且由于提取是在非托管代码中完成的,因此提取速度非常快。事实上,一些在 Acrobat 中打开时会出现令人沮丧的“图像数据不足”错误的 PDF 文档,使用 PDF Xpress 都可以轻松提取。

代码

您可以用不到 2 分钟的时间编写直观的代码,从 PDF 文档的页面中提取图像,并如下所示以 C# 保存为 JPEG-XR 图像。

using (PdfXpress pdf = new PdfXpress())
{
    using (ImagXpress ix = new ImagXpress())
    {
        pdf.Initialize();
        
        using (Document doc = new Document(pdf, "document.pdf"))
        {
            ExtractImageOptions options = new ExtractImageOptions();

            int imageCount = doc.ExtractImages(0, options);

            PDFImage pdfImage = doc.GetExtractedImage(0, 0);

            using (Bitmap pdfBitmap = pdfImage.GetBitmap())
            {
                using (ImageX img = ImageX.FromBitmap(ix, pdfBitmap))
                {
                    Accusoft.ImagXpressSdk.SaveOptions so = 
                        new Accusoft.ImagXpressSdk.SaveOptions();
                    so.Format = ImageXFormat.JpegXR;

                    img.Save("image.jxr", so);
                }
            }
        }
    }
}

摘要

PDF 图像提取是 PDF 工作流程中一个广受欢迎的功能,但常常被误解和处理不当。PDF Xpress 是一个直观的库,可以轻松处理 PDF 文档。随着 5.0 版本的发布,它现在可以快速、准确地优雅地处理 PDF 文档的图像提取。立即获取 PDF Xpress 试用版下载演示版

关于作者

Joseph Argento 是 Accusoft 公司 PDF Xpress 和 ImagXpress 的技术主管。他于 2007 年加入公司,担任支持工程师。Joseph 作为软件工程师为原生产品团队做出贡献,并拥有电气工程硕士学位。

© . All rights reserved.