将 PDF 的第一页显示为图像

Posted

技术标签:

【中文标题】将 PDF 的第一页显示为图像【英文标题】:Display first page of PDF as Image 【发布时间】:2012-08-03 10:31:41 【问题描述】:

我正在创建以缩略图格式显示图像/pdf 的 Web 应用程序。 Onclicking各自的图像/ pdf它会在新窗口中打开。

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

<iframe src="images/testes.pdf"   />

使用它我可以在网络浏览器中查看所有 PDF。但是出于缩略图的目的,我只想。

我试过了

 <h:graphicImage value="images/testes.pdf"   />

但是它不起作用。知道如何完成这项工作吗?

更新 1

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

<iframe src="#PersonalInformationDataBean.myAttachmentString"   />

更新 2

为了缩略图,我使用的是

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

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

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

【问题讨论】:

我不认为它可以在没有一些第三方 api 的情况下完成,它将首先将 pdf(第一页)转换为图像...... @Daniel : Safari 在h:graphicImage 中显示pdf。 @Daniel :查看我更新的问题。知道如何完成这项工作吗? 【参考方案1】:

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

将第一页提取为 PDF

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

    pdftk 鬼脚本

两者都适用于 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 的模拟选项是正确的。

【讨论】:

效果很好!但是用gs做jpeg的时候,最好先生成png格式,然后再转成jpeg,这样就可以设置自己想要的质量了。 (默认的不好)【参考方案2】:

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

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

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

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

第二, 它使用convert 到 PDF->JPEG 的转换。同上:反正都是用Ghostscript,为什么不直接运行呢?

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

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

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

    ...不仅运行速度更快、效率更高, ...而且它还可以让您更精细地控制 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 图像,我的没问题。

【讨论】:

感谢您的回答.. 我应该使用哪个工具?? 您可以通过添加选项限制到第一页:-dFirstPage=1 -dLastPage=1【参考方案3】:

这是我用的

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();

【讨论】:

使用哪个 PDF API?

以上是关于将 PDF 的第一页显示为图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pdf.js 将每个用户上传的 pdf 文件的第一页显示为 Django 中的预览?

UWP 打印预览仅在第一页显示空白页

如何在 PDF 中显示页数?

graphicsmagick - 将图像转换为 pdf,反之亦然

使用Docx4j和PdfBox将Docx转换为图像会导致OutOfMemoryError

将 PDF 转换为 PNG