当前位置: 首页 > 知识库问答 >
问题:

iText-检查附件是否存在/链接附件多次

师建德
2023-03-14
protected HashMap<String, PdfFileSpecification> cache = new HashMap<>();
private final byte[] BUFFER = new byte[1024];

public PdfFileSpecification getPdfFileSpecification(final PdfWriter pdfWriter, final String name, final byte[] data) throws IOException {

    String hash = createMD5Hash(data);
    PdfFileSpecification pdfFileSpecification = cache.get(hash);

    if (pdfFileSpecification == null) {
        pdfFileSpecification = PdfFileSpecification.fileEmbedded(pdfWriter, null, name, data);
        cache.put(hash, pdfFileSpecification);
        return pdfFileSpecification;
    }
    System.out.println(String.format("Name: %s Hash: %s", name, hash));
    return pdfFileSpecification;
}

private String createMD5Hash(final byte[] data) {

MessageDigest messageDigest;

    try {
        messageDigest = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        return null;
    }

    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);

    try {
        int i;
        while ((i = byteArrayInputStream.read(BUFFER)) != -1) {
            messageDigest.update(BUFFER, 0, i);
        }
        byteArrayInputStream.close();
    } catch (IOException e) {
        return null;
    }
    byte[] mdbytes = messageDigest.digest();

    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < mdbytes.length; i++) {
        sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
    }

    return sb.toString();
}

所以每次我要处理一个新的附件时,我都是这样做的:

PdfFileSpecification fs = getPdfFileSpecification(pdfWriter, name, data)
PdfAnnotation an = PdfAnnotation.createFileAttachment(pdfWriter, rectangle, name, fs);

共有1个答案

冯德宇
2023-03-14

请允许我拿着您的代码,介绍一些伪代码,向您展示我会如何做到这一点:

protected Map<String, PdfFileSpecification> cache =
    new HashMap<String, PdfFileSpecification>();

public void cellLayout(final PdfPCell pdfPCell, final Rectangle rectangle, final PdfContentByte[] pdfContentBytes) {
    String hasheddata = createHash(attachment);
    PdfFileSpecification fs = cache.get(hasheddata);
    if (fs == null) {
        fs = PdfFileSpecification.fileEmbedded(writer, null, displayname, attachment);
        cache.put(hasheddata, fs);
    }
    PdfAnnotation an = PdfAnnotation.createFileAttachment(writer, rectangle, displayname, fs);
    writer.addAnnotation(an);
}

这段代码无法编译,因为我遗漏了一些与问题无关的部分。我只保留了解释为文件规范创建缓存的概念的内容。

我创建附件字节的哈希值以节省内存。您必须使用您选择的哈希算法实现createhash()方法。在创建将向PDFWriter写入字节的新FileSpecification之前,我要检查是否不能重用已有的文件规范。如果存在,我将在注释中重用它。如果它不存在,我创建一个新的文件规范。

 类似资料:
  • 问题内容: 这是我的问题:是否可以通过某种方式检查是否存在动态附加的事件侦听器?或者如何检查DOM中“onclick”(?)属性的状态?但是没有运气。这是我的html: 然后在Javascript中,将动态创建的事件侦听器附加到第二个链接: 该代码运行良好,但是我所有检测该附加侦听器的尝试均失败: 如果单击“为2添加onclick”,然后单击“[链接2]”,则事件触发良好,但“测试链接2”始终报告

  • 问题内容: 尝试检查我要读取的文件是否存在。 问题答案: 这是另一种方法: 包装的用途和功能: p_DirName in varchar2, – schema object name p_FileName in varchar2 ) return number is l_file_loc bfile; begin l_file_loc := bfilename(upper(p_DirName),

  • 问题内容: 在python中,是否存在检查给定文件/目录是否为符号链接的函数?例如,对于以下文件,我的包装函数应返回。 问题答案: 要确定目录条目是否为符号链接,请使用以下命令: os.path.islink(路径) 如果path引用的目录条目是符号链接,则返回True。如果不支持符号链接,则始终为False。 例如,给定:

  • 问题内容: 如何检查 文件 的存在? 在模块的文档中,有方法的说明。但是,据我了解,它只检查目录的存在。而且我需要检查 文件 ! 如何才能做到这一点? 问题答案: 为什么不尝试打开文件? 无论如何,经过一分钟的搜索,请尝试以下操作: 对于Node.js v0.12.x及更高版本 双方并已弃用 *编辑: 已更改: 至: 林特抱怨双重等于不是三次等于。 使用fs.stat:

  • 问题内容: 我如何检查Java安装中是否存在像javax.servlet。*这样的包? 问题答案: Java只能告诉您是否可以加载类。它不能告诉您是否存在软件包,因为没有加载软件包,只有类。 唯一的方法是尝试从该包中加载类。例如,对于javax.servlet。*,您可以执行以下操作:

  • 我可以使用JavaMail API从电子邮件帐户下载附件。但是,有没有办法使用Java获得电子邮件附件的下载链接? 出于我的目的,我需要获得附件的下载链接,并将其提供给用户。这样用户就可以直接从电子邮件服务器下载这些附件。我将非常感谢任何其他建议。