`
shappy1978
  • 浏览: 700413 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用PDFBox转PDF文件为图片备忘

    博客分类:
  • J2EE
阅读更多

PDFBox自我手中有的0.8版本就有了转图片的功能,在其java org.apache.pdfbox.ExtractImages类中有具体的代码,但是没有很好的封装,似乎是用来做命令行的.

 

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.pdfbox;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

/**
 * This will read a read pdf and extract images. <br/><br/>
 *
 * usage: java org.apache.pdfbox.ExtractImages &lt;pdffile&gt; &lt;password&gt; [imageprefix]
 *
 * @author  <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
 * @version $Revision: 1.7 $
 */
public class ExtractImages
{
    private int imageCounter = 1;

    private static final String PASSWORD = "-password";
    private static final String PREFIX = "-prefix";

    private ExtractImages()
    {
    }

    /**
     * This is the entry point for the application.
     *
     * @param args The command-line arguments.
     *
     * @throws Exception If there is an error decrypting the document.
     */
    public static void main( String[] args ) throws Exception
    {
        ExtractImages extractor = new ExtractImages();
        extractor.extractImages( args );
    }

    private void extractImages( String[] args ) throws Exception
    {
        if( args.length < 1 || args.length > 3 )
        {
            usage();
        }
        else
        {
            String pdfFile = null;
            String password = "";
            String prefix = null;
            for( int i=0; i<args.length; i++ )
            {
                if( args[i].equals( PASSWORD ) )
                {
                    i++;
                    if( i >= args.length )
                    {
                        usage();
                    }
                    password = args[i];
                }
                else if( args[i].equals( PREFIX ) )
                {
                    i++;
                    if( i >= args.length )
                    {
                        usage();
                    }
                    prefix = args[i];
                }
                else
                {
                    if( pdfFile == null )
                    {
                        pdfFile = args[i];
                    }
                }
            }
            if(pdfFile == null)
            {
                usage();
            }
            else
            {
                if( prefix == null && pdfFile.length() >4 )
                {
                    prefix = pdfFile.substring( 0, pdfFile.length() -4 );
                }

                PDDocument document = null;

                try
                {
                    document = PDDocument.load( pdfFile );

                    if( document.isEncrypted() )
                    {

                        StandardDecryptionMaterial spm = new StandardDecryptionMaterial(password);
                        document.openProtection(spm);
                        AccessPermission ap = document.getCurrentAccessPermission();


                        if( ! ap.canExtractContent() )
                        {
                            throw new IOException(
                                "Error: You do not have permission to extract images." );
                        }
                    }

                    List pages = document.getDocumentCatalog().getAllPages();
                    Iterator iter = pages.iterator();
                    while( iter.hasNext() )
                    {
                        PDPage page = (PDPage)iter.next();
                        PDResources resources = page.getResources();
                        Map images = resources.getImages();
                        if( images != null )
                        {
                            Iterator imageIter = images.keySet().iterator();
                            while( imageIter.hasNext() )
                            {
                                String key = (String)imageIter.next();
                                PDXObjectImage image = (PDXObjectImage)images.get( key );
                                String name = getUniqueFileName( key, image.getSuffix() );
                                System.out.println( "Writing image:" + name );
                                image.write2file( name );
                            }
                        }
                    }
                }
                finally
                {
                    if( document != null )
                    {
                        document.close();
                    }
                }
            }
        }
    }

    private String getUniqueFileName( String prefix, String suffix )
    {
        String uniqueName = null;
        File f = null;
        while( f == null || f.exists() )
        {
            uniqueName = prefix + "-" + imageCounter;
            f = new File( uniqueName + "." + suffix );
            imageCounter++;
        }
        return uniqueName;
    }

    /**
     * This will print the usage requirements and exit.
     */
    private static void usage()
    {
        System.err.println( "Usage: java org.apache.pdfbox.ExtractImages [OPTIONS] <PDF file>\n" +
            "  -password  <password>        Password to decrypt document\n" +
            "  -prefix  <image-prefix>      Image prefix(default to pdf name)\n" +
            "  <PDF file>                   The PDF document to use\n"
            );
        System.exit( 1 );
    }

}

 例子很简单,可以运行,但是对于中文PDF就有问题了,如果用了中文字体,会报告Can't find the specified basefont的错误,原因是读取中文字体出错,其实是读取编码格式错误,导致读到的字体是乱码.解决上述问题后,还会出现会自动把英文字体的数字翻译为英语单词,空格翻译为space的问题.追了一天,发现可能是encoding的问题,反正解析的都是中文,于是去掉英文的默认encoding,终于可以输出比较正常的图片的.

要转换的文档和出问题的截图如下:

  

 

    之后又出现tiff图像无法导出的问题,日志中出现"getRGBImage returned NULL"的warning,查看代码发现作者这样描述:

 

    /**
     * Returns an image of the CCITT Fax, or null if TIFFs are not supported. (Requires additional JAI Image filters )
     *
     * {@inheritDoc}
     */
    public BufferedImage getRGBImage() throws IOException

    在对应警告的地方也写了TODO标签,说明是待完善的,主要是ImageIO-lib的授权所限,所以Appach不提供直接tiff支持.

    摘录两段官网上的留言

 

Andreas Lehmkühler added a comment - 15/Apr/10 01:49 PM

The ImageIO-lib provides the missing tiff-support PDFBox needs to render such images. But unfortunately the license isn't suitable, so that we can not distribute it in combination with pdfbox. I hope sooner or later sanselan [1] will support the missing tiff support. 

[1] http://commons.apache.org/sanselan/

 

Andreas Lehmkühler added a comment - 16/Apr/10 03:42 AM

I've found another source for a possible ImageIO replacement. I've found an older posting from Jeremias. He mentioned a TIFF-decompressor within Apache XMLGraphics. That should work as builtin support for T.4 and T.6 decoded XObjects. 

[1] http://www.mail-archive.com/pdfbox-dev@incubator.apache.org/msg00932.html

    JAI Image确实有效,加入后还可以把图片格式导出为tiff,但是会导致导出图片的效率很低,在开发机上大约3-5秒导出一副tiff图片,还算可以接受的范围.

//***************************************************

又发现两个问题:

1 如果图片是旋转的,会导致图片无法显示。解决方法,修改源码,处理图片时有两个地方处理了旋转图片,方法不同,但是都有问题。

2 嵌入字体时,导出为图片显示乱码,以前是导出为文字时Identity-H乱码,但是嵌入字体还OK,1.1.0后解决了,但是导出图片又出现问题,真是麻烦啊,看看到处的TODO,让人头皮发麻,这就是开源项目的无奈啊。解决,中文嵌入式字体加载存在问题。

//***************************************************

再次发现一个问题

嵌入文字中的图片位置不对(补漏洞补得好辛苦啊)。解决,是修改旋转图片代码时改错的,注意PDF的坐标系是第一象限,而不是一搬图形坐标系的第四象限。

另外发现旋转图片后老是蒙上一层粉色,很郁闷。

//***************************************************

部署到64位的2007服务器上面发现读取的字体居然和32位xp的不一样,而且仿宋体居然无法读取,只好换为宋体。

  • 大小: 4.8 KB
  • 大小: 2.9 KB
分享到:
评论
4 楼 shappy1978 2010-07-29  
PDF是开源,但是问题确实相当的多
3 楼 xiaoyangok 2010-07-28  
如果是php的话,用FPDF就能非常方便的导出pdf!
2 楼 InnocentBoy 2010-07-26  
pdftoimage绝对无敌。
1 楼 diymaster 2010-07-22  
做过一个类似的功能
将PDF文档第一页生产一张缩略图
使用了pdf-renderer
https://pdf-renderer.dev.java.net/
比较好用 但是有时会报错 生成的图片只有上面一半

相关推荐

    解决linux下pdfbox转中文pdf为图片的问题

    java用pdfbox转pdf为图片文件时,如果pdf有中文,则会出现乱码(windows下正常,linux下乱码),改用icepdf后问题解决,而且能够轻松设置欲转换成图片的格式和大小.icepdf对中文支付非常强大,以下是实例代码,可以...

    pdfbox 提取 pdf文件中的图片

    1.将一个PDF文档转换输出为一个文本文件。 2.可以从文本文件创建一个PDF文档。 3.加密/解密PDF文档。 4.向已有PDF文档中追加内容。 5.可以从PDF文档生成一张图片。 6.可以与Jakarta Lucene搜索引擎的整合。 这个小...

    java用poi转ppt为图片和用pdfbox转pdf为图片的demo

    "java用pdfbox转pdf为图片"的过程与POI类似,但涉及到的是PDF文档。PDFBox提供了丰富的API来读取和操作PDF文件。 1. 引入PDFBox库:在项目中引入`pdfbox`, `fontbox`和`pdfbox-tools`等相关依赖。 2. 打开PDF文件...

    轻松使用apache pdfbox将pdf文件生成图片.pdf

    在这个特定的场景中,PDFBox被用来将PDF文件转换为图片,这对于报表开发或者需要将PDF内容展示在其他非PDF格式的应用中非常有用。 在描述中提到的问题是,在尝试使用ImageIO来直接将PDF转换为图片时,结果可能不...

    pdfbox1.8.9实例图片转pdf和pdf转图片

    4. 保存得到的`BufferedImage`对象为图片文件,如JPEG或PNG。 示例代码可能类似: ```java PDDocument document = PDDocument.load(new File("input.pdf")); PDFRenderer renderer = new PDFRenderer(document); ...

    PDFBox pdf 转换为word文档

    在这个特定的场景中,我们关注的是使用PDFBox将PDF文档转换为Word文档的功能。 PDF到Word的转换是一个常见的需求,因为尽管PDF格式在保持文档样式和布局方面非常出色,但有时用户可能需要在Word中进行编辑或进一步...

    使用pdfbox将pdf转图片 jar包

    在本案例中,我们关注的是如何利用PDFBox将PDF文档转换为图片。这个过程通常在需要进行PDF预览、截图或者在不支持PDF格式的环境中展示内容时非常有用。 PDFBox提供了`org.apache.pdfbox.pdmodel.PDDocument`类来...

    .Net c#使用PDFBox解析PDF文件

    在.Net中使用PDFBox需要引用: 1.PDFBox-0.7.3.dlll (8 MB) 2.IKVM.GNU.Classpath (7 MB) 3.IKVM.Runtime.dll (360 kB) 4.FontBox-0.1.0-dev.dll 使用方法: private static string parseUsingPDFBox(string ...

    PDFbox IcePdf pdf转图片

    在提供的jar包中,`PdfToImage`可能是一个示例程序,演示了如何使用PDFbox或IcePdf将PDF转换为图片。通过运行这个程序并根据需要调整代码,你可以轻松地将多页PDF转换为一系列的图片文件。 总结来说,PDFbox和...

    pdfbox转图片所需字体

    在使用PDFBox将PDF转换为图片的过程中,可能会遇到一个问题,即转换后的图片显示的文字不完整或者丢失。这通常是由于PDF文档中使用的某些字体在目标系统(如操作系统或PDFBox运行的环境)中不存在造成的。为了解决这...

    pdfbox 解析pdf里的图片和文字

    在这个场景中,我们将关注如何使用PDFBox解析PDF文档中的图片和文字。 首先,提取PDF中的图片是一项关键任务。PDFBox提供了`PDDocument`类,它是处理整个PDF文档的主要入口点。通过`PDDocument.load()`方法,我们...

    利用ITEXT、PDFBOX将PDF转为图片

    PDF转换为图片是一种...综上所述,ITEXT和PDFBOX结合使用,可以在Java环境中方便地将PDF文档转换为图片。这为开发者提供了更多处理PDF文档的灵活性和可能性,但同时也需要根据具体需求选择合适的转换参数和优化策略。

    【Java】基于Pdfbox解析PDF文档中指定位置的文字和图片

    Split & Merge – 使用PDFBox,您可以将单个PDF文件分成多个文件,并将它们合并为一个文件。 Fill Forms – 使用PDFBox,您可以在文档中填写表单数据。 Print – 使用PDFBox,您可以使用标准Java打印API打印PDF文件...

    pdfbox 提取 pdf 中 文字和图片 并 可转 html

    pdfbox 提取 pdf 中 文字和图片 并 可转 html 分2个文件,一个专门提取文本,内容可转为html,另一个文件专门用来提取图片,大家可自行整合为一个文件。使用pdfbox最新提取图片的方法。

    java使用pdfbox打印PDF

    4. 创建`PDPageable`对象:这是PDFBox提供的一种接口,用于将PDF文档转换为可以打印的页面序列。 ```java PDPageable pageable = document.asPageable(); ``` 5. 实例化`PrinterJob`:使用Java的`PrinterJob`类...

    pdfbox,生成pdf文件的缩略图

    在本场景中,我们关注的是PDFBox的一个特定功能:生成PDF文件的缩略图。这有助于在显示文档列表时提供预览,类似于百度文库中对文档的呈现方式,用户可以通过缩略图快速了解文档内容。 生成PDF缩略图的核心概念是...

    轻松使用apache pdfbox将pdf文件生成图片.docx

    总结来说,Apache PDFBox 是一个强大的 PDF 处理工具,尤其适用于将 PDF 文件转换为图片。然而,处理含有中文字符的 PDF 文件时需要额外的注意事项和资源。在进行文件转换时,根据不同的需求选择合适的库和工具是至...

    C#使用PDFBox读取PDF

    总结来说,C#中使用PDFBox读取PDF并转换为TXT文件,主要涉及以下步骤: 1. 引入IKVM.NET和PDFBox的Java库。 2. 初始化Java虚拟机。 3. 加载PDF文件并创建`PDDocument`对象。 4. 使用`PDFTextStripper`提取PDF文本。 ...

    Java 解析 PDF, pdfbox读取PDF内容

    本文将深入探讨如何使用PDFBox库在Java中解析PDF并读取其内容。 PDFBox是Apache软件基金会的一个开源项目,它为Java开发者提供了一系列API来操作PDF文档,包括读取、创建、编辑以及签署PDF等任务。在本示例中,我们...

    [Java]PDF转图片解决中文乱码.zip

    在这个特定的压缩包文件中,"PDF2img"是一个基于PDFBox开发的DEMO,它设计用于解决PDF转图片时可能出现的中文乱码问题。 PDFBox是Apache软件基金会的一个开源项目,提供了丰富的API来读取、写入、修改PDF文档。在...

Global site tag (gtag.js) - Google Analytics