将 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.exe
或 gswin64c.exe
而不是 gs
。)
截至最近发布的版本,v9.05 ,上一句不再成立。我发现 Ghostscript(包括所有启动开销)需要约 1 秒才能从 756 页 PDF 规范中提取第一页,而 PDFTK 需要约 11 秒。pdftk
在页面提取方面比 Ghostscript 稍快,但对于单个页面,这种差异可能可以忽略不计。
将第一页转换为 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 中的预览?
graphicsmagick - 将图像转换为 pdf,反之亦然