java - 我正在尝试编写一个程序,该程序将密码保护用户的 pdf。用户需要能够上传 pdf 并下载受保护的
问题描述
在我的尝试中,我会得到一个损坏的文件或一个不受保护的 pfd,这是我使用的代码:
//上传文件方法
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<List<String>> uploadFiles(@RequestParam("files")List<MultipartFile> multipartFiles) throws IOException, DocumentException {
List<String> filenames = new ArrayList<>();
for (MultipartFile file : multipartFiles){
String filename = StringUtils.cleanPath(file.getOriginalFilename());
Path fileStorage = get(DIRECTORY, filename).toAbsolutePath().normalize();
copy(file.getInputStream(), fileStorage, REPLACE_EXISTING);
File f = new File(String.valueOf(fileStorage));
if(!f.exists() && !f.isDirectory()) {
try {
FileInputStream fis = new FileInputStream(f);
PdfReader pdfReader = new PdfReader(fis);
pdfReader.setUnethicalReading(true);
WriterProperties writerProperties = new WriterProperties();
writerProperties.setStandardEncryption(OWNER_PASSWORD.getBytes(),
USER_PASSWORD.getBytes(), EncryptionConstants.ALLOW_PRINTING,
EncryptionConstants.ENCRYPTION_AES_128);
PdfWriter pdfWriter = new PdfWriter(new FileOutputStream("Protected_"+DIRECTORY), writerProperties);
PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter);
pdfDocument.close();
} catch (Exception e) {
e.printStackTrace();
}
}
filenames.add(filename);
}
return ResponseEntity.ok().body(filenames);
}
对此问题的任何帮助将不胜感激。因为我需要我的用户上传一个普通的 pdf 文件,并能够下载相同的 pdf 文件并有密码保护
解决方案
感谢您提出将其分解的建议,创建加密方法有助于生成受保护的文件。
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<List<String>> uploadFiles(@RequestParam("files")List<MultipartFile> multipartFiles) throws IOException, DocumentException {
List<String> filenames = new ArrayList<>();
for (MultipartFile file : multipartFiles){
String filename = StringUtils.cleanPath(file.getOriginalFilename());
Path fileStorage = get(DIRECTORY, filename).toAbsolutePath().normalize();
copy(file.getInputStream(), fileStorage, REPLACE_EXISTING);
encrypt(fileStorage, filename);
filenames.add(filename);
}
return ResponseEntity.ok().body(filenames);
}
public static void encrypt(Path src, String filename){
try {
FileInputStream fis = new FileInputStream(String.valueOf(src));
PdfReader pdfReader = new PdfReader(fis);
pdfReader.setUnethicalReading(true);
WriterProperties writerProperties = new WriterProperties();
writerProperties.setStandardEncryption(OWNER_PASSWORD.getBytes(),
USER_PASSWORD.getBytes(), EncryptionConstants.ALLOW_PRINTING,
EncryptionConstants.ENCRYPTION_AES_128);
PdfWriter pdfWriter = new PdfWriter(new FileOutputStream(filename), writerProperties);
PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter);
pdfDocument.close();
} catch (Exception e) {
e.printStackTrace();
}
}
推荐阅读
- java - 添加 XSSFWorkbook workbook = new XSSFWorkbook(inputWorkbook); 时语句来回走动
- odoo - Odoo:如何在向表单“添加新行”后发送 message_post()
- c# - C# auto-insert data from SQL table to web application
- javascript - SQLite3 表仅包含 1 行
- apache - Visual Studio 更改默认侦听端口
- biztalk - 将参数传递给 BizTalk xslt 映射
- react-native - 如何在推送通知 React Native 中检测 Onpress
- reactjs - 延迟加载 i18n 反应问题
- sql - 搜索不完整的数据,对最佳匹配进行评分
- c# - 同一位置的多个列表视图对象