我正在创建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" />
然而,它不起作用。知道如何完成这项工作吗?
我提供pdf文件的路径,例如用途。但是我在数据库中有图像。实际上我的代码如下。
<iframe src="#{PersonalInformationDataBean.myAttachmentString}" width="800" height="200" />
为了缩略图,我正在使用的是
<h:graphicImage height=200 width=200 value="....">
但是我也需要为PDF实现相同的目标。
希望我清楚我所期待的......
答案 0 :(得分:4)
我不确定所有浏览器是否同样显示您的嵌入式PDF(通过<h:graphicImage value="some.pdf" ... />
完成)。
如果您坚持使用PDF,我建议使用以下两种命令行工具之一来提取任何PDF的第一页:
pdftk
两者均适用于Linux,Mac OS X和Windows。
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.exe
或gswin64c.exe
代替gs
。)
截至最新发布的版本,v9 .05,前一句不再正确。我发现Ghostscript(包括所有启动开销)需要大约1秒才能从756页PDF规范中提取第一页,而PDFTK需要大约11秒。 pdftk
比Ghostscript略快,但对于单个页面来说,差异可能是可以忽略的。
如果您想确保即使是较旧的浏览器也能很好地显示您的第一页,请将其转换为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
。
请注意,JPEG格式不适合包含高黑+白对比度和锐边(如文本页面)的图像。 PNG对此更好。
使用Ghostscript从第一个PDF页面创建PNG非常简单:
gs -o page-1-of-input-PDF.png -sDEVICE=pngalpha -dLastPage=1 input.pdf
当提取页面范围时,与JPEG一样的模拟选项也是正确的。
答案 1 :(得分:1)
警告:除非你想要...否则不要使用Ma9ic的脚本(在另一个答案中发布)
虽然它可能对你有好处,但是在这八个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 ......
为作业使用正确的工具,并正确使用它!
<强>更新强>
因为我被问到,这是我对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:
答案 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();
}