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
相关产品推荐
相关产品推荐

