使用itextpdf从3d pdf中提取缩略图

时间:2018-02-14 17:05:38

标签: java pdf itext

当我使用Adobe Acrobat Reader查看3D pdf(又名PDF / E)时,它会在左侧显示缩略图:

3d pdf viewed with Acrobat Reader

是否可以使用itext从pdf中提取此缩略图,还是由观众动态生成?

1 个答案:

答案 0 :(得分:3)

这是可能的,但从我所看到的情况来看,我怀疑你的PDF有一个特定的缩略图,只是在缩略图中呈现页面。

首先,让我们根据PDF规范创建一个包含缩略图的PDF,因为我找不到。 ISO-3200-2的第12.3.4节(PDF规范)规定如下:

  

页面的缩略图图像应为页面对象中 Thumb 条目指定的图像XObject ...

这可以使用iText轻松创建,如下所示:

PdfWriter writer = new PdfWriter(OUTPUT_FILE);
PdfDocument pdfDocument = new PdfDocument(writer);
Document document = new Document(pdfDocument);
document.add(new Paragraph("Hello world"));
PdfImageXObject thumbnail = new PdfImageXObject(ImageDataFactory.create(getInput("itext.png")));
pdfDocument.getFirstPage().getPdfObject().put(PdfName.Thumb, thumbnail.getPdfObject());
document.close();

getInput("itext.png")解析为我们图片的完整路径:

enter image description here

这给了我们output.pdf

您会注意到Acrobat和Reader都没有显示缩略图 - 他们只是渲染页面。其他读者使用我们的新缩略图:

enter image description here

由于您正在使用阅读器,我认为这意味着PDF中的缩略图只是呈现的页面,因为缩略图似乎被忽略。

要回答您的问题,获取缩略图与上面的操作完全相反 - 我们获取Page的字典并查找 / Thumb 条目

PdfReader reader = new PdfReader(OUTPUT_FILE);
PdfDocument pdfDocument = new PdfDocument(reader);
PdfStream thumbnailStream = pdfDocument.getFirstPage().getPdfObject().getAsStream(PdfName.Thumb);
if (thumbnailStream != null) {
    PdfImageXObject thumbnail = new PdfImageXObject(thumbnailStream);
    BufferedImage image = thumbnail.getBufferedImage();
    //Output to file, memory, etc
}