pdf - PDF 字符串中使用的未知编码
问题描述
我正在编写代码以从 PDF 文件中提取 URL。在大多数文件中,URL 显示为纯 ascii。但是,在某些 PDF 文件中,例如 PDF 规范本身 ( https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf ),URL 以十六进制形式出现,看起来没有结构。
例如,在上述文件中,在主要元数据中,作者出现为:
/Author <F240D629CD72348F>
Atril 和其他 PDF 查看器将其解码为“Jim King”。正如预期的那样,十六进制字符串的长度是文字值长度的两倍,但被打乱了,无法识别。假设字节值到字符的 1:1 映射,“i”被编码为 0x40 和 0x72。
实际网址值:
<EB345AA632781A90E90781A4A0BF42680D1F1AD67910B293798B0AFFED8407CE12684F21B7F471D96DCE4864CAB970A98E7F911C207A12C6E6900D789BC13AE87E76A9D6B8EDDADE7A53EAA521E6421295EA31305C>
应解码为:
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=51502
我还查看了设法解码这些字符串的 PyPDF2 源代码,但我还没有找到答案。
如何在 PDF 文档中找到用于注释的编码?
解决方案
示例 pdf 已加密,您可以通过查看包含Encrypt条目的预告片来确定:
/Encrypt 126988 0 R
因此,该 pdf 中的所有字符串和流(除了极少数例外)都是加密的。
(如果您想知道为什么在打开文件时不必输入密码:pdf 标准定义了一个默认密码,pdf 处理器在要求用户提供密码之前会尝试该密码。此处使用此默认密码。)
因此,在分析字符串之前,您必须解密它们。如果您不想自己实现解密,可以使用 qpdf 之类的工具来为您的代码做准备。
推荐阅读
- python - python - 将空列表索引设置为0
- java - 带有 Spring boot 的 Keyvault MSI:如何配置 keyvault 以在本地运行时使用 Azure cli 凭据而不是托管标识?
- python - 如何更改 Black(Python 格式化程序)的换行设置?
- php - 如何在 Woocommerce 5.2 中以编程方式创建可变产品
- java - 在同一 JVM 进程中以编程方式启用和禁用 SSL SNI 扩展
- android - 声明提供工件的存储库,请参阅文档
- javascript - REACT/REDUX 动作没有被分派
- sql - 选择条件列但获取子查询返回超过 1 个值
- html - Div 容器突然显示不正确 - 代码没有变化,是什么原因?
- laravel - Laravel Guest-checkout is not working in paypal using "paypal/rest-api-sdk-php": "*" this package also success response is not getting on it