如何检测PDF是否在Java中压缩了外部参照表?

如何检测PDF是否在Java中压缩了外部参照表?,java,pdf,itext,Java,Pdf,Itext,库中是否有API可用于检测PDF文件是否压缩了外部参照表 这个库的类有一些关于外部参照的有用API,但没有一个符合我的目的 要求是: 检查PDF是否有外部参照压缩表 如果1为真->则“解压缩”外部参照表 发送字节流以进行进一步处理 处理完成后,将外部参照表“压缩”回其原始形式 在此方面的任何建议都将不胜感激 p.S.:实施不限于iText。任何其他可以实现它的Java库都可以使用。许可(如果需要)也不是问题。您最好的选择可能是查看您还想对PDF做什么,然后使用该库 您的最佳选择可能是查看PDF的

库中是否有API可用于检测PDF文件是否压缩了外部参照表

这个库的类有一些关于外部参照的有用API,但没有一个符合我的目的

要求是:

  • 检查PDF是否有外部参照压缩表
  • 如果1为真->则“解压缩”外部参照表
  • 发送字节流以进行进一步处理
  • 处理完成后,将外部参照表“压缩”回其原始形式
  • 在此方面的任何建议都将不胜感激


    p.S.:实施不限于iText。任何其他可以实现它的Java库都可以使用。许可(如果需要)也不是问题。

    您最好的选择可能是查看您还想对PDF做什么,然后使用该库

    您的最佳选择可能是查看PDF的其他用途,然后使用该库

    事实证明,iText已经支持这一点。 您需要创建一个
    PdfReader
    实例,然后使用
    isNewXrefType()

    要解压缩PDF文档的外部参照表,可以使用以下方法:

    public void uncompressXRef(String src, String dest)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.close();
        reader.close();
    }
    
    public void recompressXRef(String src, String dest)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.getWriter().setFullCompression();
        stamper.close();
        reader.close();
    }
    
    要重新压缩外部参照表,请使用以下方法:

    public void uncompressXRef(String src, String dest)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.close();
        reader.close();
    }
    
    public void recompressXRef(String src, String dest)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.getWriter().setFullCompression();
        stamper.close();
        reader.close();
    }
    

    事实证明,iText已经支持这一点。 您需要创建一个
    PdfReader
    实例,然后使用
    isNewXrefType()

    要解压缩PDF文档的外部参照表,可以使用以下方法:

    public void uncompressXRef(String src, String dest)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.close();
        reader.close();
    }
    
    public void recompressXRef(String src, String dest)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.getWriter().setFullCompression();
        stamper.close();
        reader.close();
    }
    
    要重新压缩外部参照表,请使用以下方法:

    public void uncompressXRef(String src, String dest)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.close();
        reader.close();
    }
    
    public void recompressXRef(String src, String dest)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.getWriter().setFullCompression();
        stamper.close();
        reader.close();
    }
    

    由于iText(以及其他PDF库)是在后台完成这些任务的,因此应该可以为这些任务重用代码。不过,我怀疑您是否会发现所需的方法明确公开可用。交叉引用表管理通常是内部事务。通过web/SO搜索“Java PDF parser”-“parser”一词似乎对查找此类内容起到了至关重要的作用。由于iText(以及其他PDF库)是在幕后完成这些任务的,因此应该可以为这些任务重用代码。不过,我怀疑您是否会发现所需的方法明确公开可用。交叉引用表管理通常是内部事务。通过web/SO搜索“Java PDF parser”-“parser”一词似乎对查找此类内容有很大影响。如果它是开源的,则是。所需的功能通常可能隐藏在库用户之外,因此,可能需要做一些需要了解内部结构的技巧。您经常会发现商业产品的供应商乐于倾听您的请求并添加功能。有相当多的公司的产品将包含此功能。或者你也可以去破解Icepdf、IText、JPedal或PdfBox。如果是开源的,可以。所需的功能通常可能隐藏在库用户之外,因此,可能需要做一些需要了解内部结构的技巧。您经常会发现商业产品的供应商乐于倾听您的请求并添加功能。有相当多的公司的产品将包含此功能。或者你可以看看破解Icepdf、IText、JPedal或PdfBox。你能提供一些指针来取消压缩和重新压缩外部参照表吗?我在回答中添加了两种方法。您可能希望将它们合并为一个,添加一个布尔参数以指示是否要压缩生成的PDF的外部参照表。您还可以提供一些用于取消压缩和重新压缩外部参照表的指针吗?我在回答中添加了两种方法。您可能希望将它们合并为一个,添加一个布尔参数以指示是否要压缩生成的PDF的外部参照表。