11

我正在创建以缩略图格式显示图像/ pdf 的 Web 应用程序。Onclicking各自的图像/ 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 实现相同的目标。

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

4

3 回答 3

7

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

将第一页提取为 PDF

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

  1. pdftk
  2. 鬼脚本

两者都可用于 Linux、Mac OS X 和 Windows。

pdftk 命令

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

鬼脚本命令

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 一样的模拟选项是正确的。

于 2012-08-06T18:47:11.503 回答
1

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

  • ...使 PDF->JPEG 转换消耗比应有的更多时间和资源
  • ...完全放弃对 PDF->JPEG 转换过程的控制。

虽然它可能对您很有效,但在这 8 行 Bash 中存在很多问题。

首先,
它用于identify从输入的 PDF 中提取页数。但是,identify(ImageMagick 的一部分)完全无法单独处理 PDF。它必须将 Ghostscript 作为“代表”运行以处理 PDF 输入。直接使用 Ghostscript 而不是通过 ImageMagick 间接运行它会更有效。

其次,
它用于convertPDF->JPEG转换。与上述相同:它无论如何都使用Ghostscript,所以为什么不直接运行它呢?

第三,
它循环页面并convert为 PDF 的每一页运行不同的过程,即 100 页 PDF 文件的 100 次转换。这意味着:它还运行 100 个 Ghostscript 命令来生成 100 个 JPEG。

第四, Fahim Parkar 的问题是从 PDF 的第一
页 获取缩略图,而不是从所有页面获取缩略图。

该脚本确实为 100 页的 PDF 运行了至少 201 个不同的命令,而这一切都可以在 1 个命令中完成。如果你直接用Ghostscript...

  1. ...不仅运行速度更快、效率更高,
  2. ...但它也会让您对 JPEG 的质量设置进行更细粒度和更好的控制。

为工作使用正确的工具,并正确使用它!


更新:

既然有人问我,这是我对 Ma9ic 脚本的替代实现。

#!/bin/bash
文件=${1}

gs -q -o $(basename "${infile}")_p%04d.jpeg -sDEVICE=jpeg "${infile}"

# 要获取宽度为 200 像素的缩略图 JPEG,请使用以下命令:
# gs -q -o name_200px_p%04d.jpg -sDEVICE=jpeg -dPDFFitPage -g200x400 "${infile}"

# 获得更高质量的 JPEG(但也包括更大尺寸的)
# 分辨率为 300 dpi 使用以下命令:
# gs -q -o name_300dpi_p%04d.jpg -sDEVICE=jpeg -dJPEGQ=100 -r300 "${infile}"

回声“完成”

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

  • Ma9ic 的版本需要 1413 秒生成 756 个 JPEG。
  • 我的版本节省了 93% 的时间,耗时 91 秒。
  • 此外,Ma9ic 的脚本在我的系统上生成的主要是黑色 JPEG 图像,我的还可以。
于 2012-08-06T16:33:18.883 回答
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();
}
于 2013-02-12T12:36:40.520 回答