将PDF的第一页显示为图像

时间:2012-08-06 12:43:10

标签: html image pdf iframe jsf-2

我正在创建Web应用程序,我以缩略图格式显示images / pdf。点击相应的图片/ pdf,它将在新窗口中打开。

对于PDF,我有(这是新窗口的代码)

<iframe src="images/testes.pdf" width="800" height="200" />

使用此功能,我可以在网络浏览器中查看所有PDF。但是出于缩略图的目的,我想只显示PDF的第一页作为图像。

我试过

 <h:graphicImage value="images/testes.pdf" width="800" height="200" />
然而,它不起作用。知道如何完成这项工作吗?

更新1

我提供pdf文件的路径,例如用途。但是我在数据库中有图像。实际上我的代码如下。

<iframe src="#{PersonalInformationDataBean.myAttachmentString}" width="800" height="200" />

更新2

为了缩略图,我正在使用的是

 <h:graphicImage height=200 width=200 value="...."> 

但是我也需要为PDF实现相同的目标。

希望我清楚我所期待的......

3 个答案:

答案 0 :(得分:4)

我不确定所有浏览器是否同样显示您的嵌入式PDF(通过<h:graphicImage value="some.pdf" ... /> 完成)。

以PDF格式提取第一页

如果您坚持使用PDF,我建议使用以下两种命令行工具之一来提取任何PDF的第一页:

  1. pdftk
  2. Ghostscript的
  3. 两者均适用于Linux,Mac OS X和Windows。

    pdftk命令

    pdftk input.pdf cat 1 output page-1-of-input.pdf
    

    Ghostscript命令

    gs -o page-1-of-input.pdf -sDEVICE=pdfwrite -dPDFLastPage=1 input.pdf
    

    (在Windows上使用gswin32c.exegswin64c.exe代替gs。)

    在页面提取方面,

    pdftk比Ghostscript略快,但对于单个页面来说,差异可能是可以忽略的。 截至最新发布的版本,v9 .05,前一句不再正确。我发现Ghostscript(包括所有启动开销)需要大约1秒才能从756页PDF规范中提取第一页,而PDFTK需要大约11秒。

    将第一页转换为JPEG

    如果您想确保即使是较旧的浏览器也能很好地显示您的第一页,请将其转换为JPEG。 Ghostscript是你的朋友(ImageMagick不能单独完成,无论如何都需要Ghostscript的帮助):

    gs -o page-1-of-input-PDF.jpeg -sDEVICE=jpeg -dLastPage=1 input.pdf
    

    如果你需要第33页,你可以这样做:

    gs -o page-33-of-input-PDF.jpeg -sDEVICE=jpeg -dFirstPage=33 -dLastPage33 input.pdf
    

    如果您需要一系列PDF,例如第17-23页,请尝试以下操作:

    gs -o page-16+%03d-of-input-PDF.jpeg -sDEVICE=jpeg -dFirstPage=17 -dLastPage23 input.pdf
    

    请注意,%03d符号会随着每个页面的处理而递增,从1开始。因此,您的第一个JPEG名称将为page-16+001-of-input-PDF.jpeg

    也许PNG更好?

    请注意,JPEG格式不适合包含高黑+白对比度和锐边(如文本页面)的图像。 PNG对此更好。

    使用Ghostscript从第一个PDF页面创建PNG非常简单:

    gs -o page-1-of-input-PDF.png -sDEVICE=pngalpha -dLastPage=1 input.pdf
    

    当提取页面范围时,与JPEG一样的模拟选项也是正确的。

答案 1 :(得分:1)

警告:除非你想要...否则不要使用Ma9ic的脚本(在另一个答案中发布)

  • ...使PDF-&gt; JPEG转换消耗的时间+资源远远超过应有的时间
  • ...完全放弃对PDF-&gt; JPEG转换过程的控制。

虽然它可能对你有好处,但是在这八个Bash中有很多问题。

<强>首先,
它使用identify从输入PDF中提取页面数。但是,identify(ImageMagick的一部分)完全无法自行处理PDF。它必须运行Ghostscript作为'委托'来处理PDF输入。通过ImageMagick直接使用Ghostscript而不是间接运行它会更有效率。

<强>其次,
它使用convert进行PDF-&gt; JPEG转换。与上面相同:它仍然使用Ghostscript,为什么不直接运行呢?

<强>第三,
它遍历页面并为PDF的每一页运行不同的convert进程,即100页PDF文件的100个转换。这意味着:它还运行100个Ghostscript命令来生成100个JPEG。

<强>四下,
Fahim Parkar的问题是从PDF的第一个页面获取缩略图,而不是从所有这些页面获取。

脚本确实为100页PDF运行至少201个不同的命令,只需1个命令即可完成。如果你直接Ghostscript ......

  1. ......它不仅会更快更有效地运行,
  2. ...但它也可以让您更精细,更好地控制JPEG的质量设置。
  3. 为作业使用正确的工具,并正确使用它!


    <强>更新

    因为我被问到,这是我对Ma9ic脚本的替代实现。

    #!/bin/bash 
    infile=${1}
    
    gs -q -o $(basename "${infile}")_p%04d.jpeg -sDEVICE=jpeg "${infile}"
    
    # To get thumbnail JPEGs with a width 200 pixel use the following command:
    # gs -q -o name_200px_p%04d.jpg -sDEVICE=jpeg -dPDFFitPage -g200x400 "${infile}"
    
    # To get higher quality JPEGs (but also bigger-in-size ones) with a 
    # resolution of 300 dpi use the following command:
    # gs -q -o name_300dpi_p%04d.jpg -sDEVICE=jpeg -dJPEGQ=100 -r300 "${infile}"
    
    echo "Done"
    

    我甚至对它进行了基准测试。我用这两个脚本将756页的PDF-1.7规范转换为JPEG:

    • Ma9ic的版本需要1413秒才能生成756个JPEG。
    • 我的版本节省了93%的时间,耗时91秒。
    • 此外,Ma9ic的脚本在我的系统上产生大多数黑色JPEG图像,我的是好的。

答案 2 :(得分:1)

这是我用的

Document document = new Document();
try {
    document.setFile(myProjectPath);
    System.out.println("Parsed successfully...");
} catch (PDFException ex) {
    System.out.println("Error parsing PDF document " + ex);
} catch (PDFSecurityException ex) {
    System.out.println("Error encryption not supported " + ex);
} catch (FileNotFoundException ex) {
    System.out.println("Error file not found " + ex);
} catch (IOException ex) {
    System.out.println("Error handling PDF document " + ex);
}



// save page caputres to file.
float scale = 1.0f;
float rotation = 0f;

System.out.println("scale == " + scale);

// Paint each pages content to an image and write the image to file
InputStream fis2 = null;
File file = null;
for (int i = 0; i < 1; i++) {
    BufferedImage image = (BufferedImage) document.getPageImage(i,
    GraphicsRenderingHints.SCREEN,
    Page.BOUNDARY_CROPBOX, rotation, scale);
    RenderedImage rendImage = image;
    // capture the page image to file
    try {
        System.out.println("\t capturing page " + i);
        file = new File(myProjectActualPath + "myImage.png");
        ImageIO.write(rendImage, "png", file);
        fis2 = new BufferedInputStream(new FileInputStream(myProjectActualPath + "myImage.png"));

    } catch (IOException ioe) {
        System.out.println("IOException :: " + ioe);
    } catch (Exception e) {
        System.out.println("Exception :: " + e);
    }
    image.flush();
}