You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Telegram Bot发送PDF却返回TXT格式问题求助

问题分析与解决方案:发送PDF被识别为TXT格式

这个问题的核心原因很明确:你没有给Telegram Bot API提供足够的文件类型标识信息。

你当前使用的SendDocument(clientExtId, data)构造方法只传入了聊天ID和原始字节数组,Telegram无法从纯字节数据中自动推断出这是一个PDF文件,所以只能默认将其归类为文本文件(.txt格式)。而图片能正常识别,是因为图片字节流里包含了JPG/PNG特有的文件头标记,API可以自动识别出来,但PDF没有这个待遇。

解决方法:明确指定文件名(带扩展名)

你需要使用带有文件名参数的SendDocument构造方法,或者通过链式调用设置文件名,明确告诉Telegram这是一个PDF文件。

修改你的sendFileToClient方法中的SendDocument初始化代码:

private String sendFileToClient(String clientExtId, String file) {
    String fileLink;
    // 先拆分出base64数据部分(因为你的file字符串是"application/pdf;base64,..."格式)
    String[] fileParts = file.split(",");
    byte[] data = DatatypeConverter.parseBase64Binary(fileParts[1]);
    
    // 关键:指定带.pdf扩展名的文件名,让Telegram识别文件类型
    SendDocument sendDocument = new SendDocument(clientExtId, data)
            .fileName("your_document.pdf"); // 这里可以根据实际业务动态设置文件名
    
    try {
        SendResponse execute = telegramBot.execute(sendDocument);
        Document document = execute.message().document();
        final String documentId = document.fileId();
        fileLink = getFileLink(documentId);
        return fileLink;
    } catch (Exception e) {
        // 异常处理逻辑
    }
}

如果你使用的API版本支持带文件名的构造方法,也可以直接这样写:

SendDocument sendDocument = new SendDocument(clientExtId, data, "your_document.pdf");

原理说明

当你指定了带.pdf扩展名的文件名后,Telegram Bot API会自动推断对应的MIME类型为application/pdf,并将这些信息一起发送给Telegram服务器。服务器收到后就会正确将文件保存为PDF格式,你在getFileLink方法中看到的filePath也会变成类似documents/file_203.pdf,客户端收到的自然也是PDF文件了。

如果你的业务场景中需要动态使用原始文件名,可以从file字符串的相关元数据(如果有的话)中提取文件名,替换掉硬编码的your_document.pdf即可。

内容的提问来源于stack exchange,提问作者GoodWin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:52:47