【问题标题】:extract thumbnail from 3d pdf using itextpdf使用 itextpdf 从 3d pdf 中提取缩略图
【发布时间】:2018-07-25 08:19:25
【问题描述】:

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

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

【问题讨论】:

    标签: java pdf itext


    【解决方案1】:

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

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

    页面的缩略图应该是由页面对象中的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") 解析为我们图像的完整路径:

    这给了我们output.pdf

    您会注意到,Acrobat 和 Reader 都不会显示缩略图 - 它们只是呈现页面。其他读者确实使用我们的新缩略图:

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

    为了回答您的问题,获取缩略图只是上面操作的逆过程——我们获取页面的字典并查找 /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
    }
    

    【讨论】:

    • 感谢您的详尽回答。你是对的:pdf 不包含缩略图。我希望是这样,因为视角与 pdf 中的预定义视角不同(放大时 + 拇指看起来像素化)。事实证明,Acrobat DC 会在您第一次打开拇指选项卡时创建拇指。所以如果你已经操纵了视图,它会改变拇指:)
    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2011-07-03
    • 2023-02-10
    • 2012-05-08
    相关资源
    最近更新 更多