macos - 从原始 PDF 文本恢复被 Mac 的 Preview 应用程序损坏的 PDF 中的注释
问题描述
概括
MacOS 原生用于查看和编辑 PDF 的“预览”应用程序有一个恼人的错误,该错误似乎自“High Sierra”以来就存在,并且在当前操作系统版本“Catalina”中仍未解决。它表现为以下方式:
- 打开多个 PDF 并使用多个文本突出显示或注释进行注释
- PDF 已保存但保持打开状态
- 预览应用程序意外退出,但提供重新打开所有文件
- 这样做时,文件包含所有已保存注释的看似随机的子集
- 即使使用 Acrobat Reader DC 打开损坏的 PDF,大多数注释也消失了。
我尝试过的事情
昨天,在对多个 PDF 文件进行了一些重要工作后,我出现了这个错误,导致我调查了这个问题。由于我打开的文件存储在同步文件夹中,因此我可以访问我正在处理的文件的多个版本。我注意到两件事:
- 出于某种原因,即使是在我进行了大多数注释但在崩溃发生之前同步的版本也只会显示注释的一个子集。
- 文件大小随着时间的推移而增加,这让我假设丢失的注释仍存储在文件中,但不知何故已损坏,因此未显示。
这让我认为预览以某种损坏的形式保存了新的注释,但仍然能够以某种方式处理查看它们 - 至少在它崩溃之前有一段时间。
在网上搜索解决方案时,我遇到了建议“修复”PDF( )的这个帖子,但这并没有解决我的问题。qpdf
qpdf --qdf original.pdf unpacked.pdf
相反,我决定以文本格式查看原始 PDF 的来源,看看我是否能发现一些东西。正如我所料,在损坏的 PDF 中搜索我的用户名会显示大量匹配项,显然我所做的每个注释都有一个匹配项。另一方面,对“已修复”的文件执行相同操作,qpdf
仅针对实际显示在 PDF 中的注释显示匹配项。我试图找出注释源代码中出现的一些模式与那些没有出现的注释的模式,但到目前为止还没有成功。
问题
我现在的希望是,有人可以在没有显示的注释源代码中发现问题,以解决这个混乱。我感兴趣的问题是:
是否有某种方法可以编辑 PDF 源代码(最好是自动)以恢复被 Mac 的 Preview 应用程序损坏的注释?
示例性参考
显然,我们首先需要弄清楚出了什么问题。由于我不允许自己上传 PDF,因此我提供了一些我认为相关的来源摘录,请随时索取更多摘录!摘录包含对两个出现的注释和两个不出现的注释的 obj 标识符的引用。
出现的笔记
- “1741 0” - (4 到 5 个参考)
在第 3865 行
106 0 obj << /Annots [ 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 1740 0 R 1741 0 R 1742 0 R ] /Type /Page /MediaBox [ 0 0 595.245 793.92 ] /Resources << /Font << /F1 776 0 R /F2 791 0 R /F11 463 0 R /F4 766 0 R /F5 771 0 R /F7 786 0 R /F8 453 0 R >> /Properties << /MC55 108 0 R /MC56 114 0 R /MC51 110 0 R /MC52 112 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ExtGState << /GS3 752 0 R /GS7 751 0 R /GS5 462 0 R >> >> /Parent 739 0 R /B [ 811 0 R 810 0 R ] /Rotate 0 /Contents 107 0 R /StructParents 7 /CropBox [ 0 0 595.245 793.92 ] >> endobj
在第 8953 行
1739 0 obj [ 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 1742 0 R 1741 0 R 1740 0 R 1757 0 R 1759 0 R 1760 0 R 1758 0 R 1791 0 R 1792 0 R 1793 0 R 1815 0 R 1823 0 R 1824 0 R 1957 0 R 1958 0 R ] endobj 1740 0 obj << /F 4 /Type /Annot /Rect [ 297.7432 133.1971 369.7432 169.1971 ] /DA (/Helvetica 12 Tf 0 g) /Border [ 0 0 0 ] /M (D:20200728145314Z00'00') /C [ 0.984314 0.360784 0.537255 ] /Subtype /Popup >> endobj
在第 8963 行(直接在之前的参考之后)
1741 0 obj << /C [ 0.984314 0.360784 0.537255 ] /Border [ 0 0 0 ] /DA (/Helvetica 12 Tf 0 g) /F 4 /Subtype /Highlight /Type /Annot /Rect [ 42.816 110.6414 293.7432 129.1971 ] /M (D:20200728145314Z00'00') /AP << /N 1750 0 R >> /Contents (So turning off multi-start to get a better comparison!) /QuadPoints [ 271.8799 129.1971 293.7432 129.1971 271.8799 121.0995 293.7432 121.0995 42.816 118.739 103.5295 118.739 42.816 110.6414 103.5295 110.6414 ] /T (Marco Langiu) >> endobj
在第 10721 行(可能不是实际参考)
0001031741 00000 n
在第 11414 行:
106 0 obj << /Annots [ 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 1740 0 R 1741 0 R 1742 0 R ] /Type /Page /MediaBox [ 0 0 595.245 793.92 ] /Resources << /Font << /F1 776 0 R /F2 791 0 R /F11 463 0 R /F4 766 0 R /F5 771 0 R /F7 786 0 R /F8 453 0 R >> /Properties << /MC55 108 0 R /MC56 114 0 R /MC51 110 0 R /MC52 112 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ExtGState << /GS3 752 0 R /GS7 751 0 R /GS5 462 0 R >> >> /Parent 739 0 R /B [ 811 0 R 810 0 R ] /Rotate 0 /Contents 107 0 R /StructParents 7 /CropBox [ 0 0 595.245 793.92 ] >> endobj
- “1833 0” - (5 个参考)
在第 3875 行
124 0 obj << /Annots [ 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 1833 0 R 1834 0 R ] /Type /Page /MediaBox [ 0 0 595.245 793.92 ] /Resources << /Font << /F7 786 0 R /F1 776 0 R /F2 791 0 R /F4 766 0 R /F11 463 0 R /F5 771 0 R >> /Properties << /MC68 130 0 R /MC69 132 0 R /MC63 128 0 R /MC64 126 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ExtGState << /GS3 752 0 R /GS7 751 0 R /GS5 462 0 R >> >> /Parent 739 0 R /B [ 809 0 R 808 0 R ] /Rotate 0 /Contents 125 0 R /StructParents 8 /CropBox [ 0 0 595.245 793.92 ] >> endobj
在第 9475 行
1832 0 obj [ 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 1833 0 R 1834 0 R 1842 0 R 1850 0 R 1851 0 R 1867 0 R 1866 0 R 1868 0 R ] endobj
在第 9483 行(直接在先前参考之后)
1833 0 obj << /C [ 0.984314 0.360784 0.537255 ] /Border [ 0 0 0 ] /DA (/Helvetica 12 Tf 0 g) /F 4 /Subtype /Highlight /Type /Annot /Rect [ 33.006 264.2444 284.3759 324.65 ] /M (D:20200728150458Z00'00') /AP << /N 1835 0 R >> /Contents (Which result is in agreement with 2017?) /QuadPoints [ 202.8095 324.65 284.2632 324.65 202.8095 316.5524 284.2632 316.5524 33.006 314.183 284.297 314.183 33.006 306.0854 284.297 306.0854 33.006 303.725 284.36 303.725 33.006 295.6274 284.36 295.6274 33.006 293.2671 284.3759 293.2671 33.006 285.1695 284.3759 285.1695 33.006 282.8 283.9609 282.8 33.006 274.7024 283.9609 274.7024 33.006 272.342 190.5361 272.342 33.006 264.2444 190.5361 264.2444 ] /T (Marco Langiu) >> endobj
在第 11423 行
endobj 124 0 obj << /Annots [ 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 1833 0 R 1834 0 R 1967 0 R ] /Type /Page /MediaBox [ 0 0 595.245 793.92 ] /Resources << /Font << /F7 786 0 R /F1 776 0 R /F2 791 0 R /F4 766 0 R /F11 463 0 R /F5 771 0 R >> /Properties << /MC68 130 0 R /MC69 132 0 R /MC63 128 0 R /MC64 126 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ExtGState << /GS3 752 0 R /GS7 751 0 R /GS5 462 0 R >> >> /Parent 739 0 R /B [ 809 0 R 808 0 R ] /Rotate 0 /Contents 125 0 R /StructParents 8 /CropBox [ 0 0 595.245 793.92 ] >> endobj
在第 11508 行
1966 0 obj [ 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 1833 0 R 1834 0 R 1967 0 R ] endobj
没有出现的笔记
- “1454 0” - (2 个参考)
在第 6194 行
1256 0 obj [ 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 1257 0 R 1258 0 R 1273 0 R 1281 0 R 1282 0 R 1297 0 R 1306 0 R 1307 0 R 1309 0 R 1305 0 R 1308 0 R 1346 0 R 1347 0 R 1345 0 R 1369 0 R 1371 0 R 1370 0 R 1405 0 R 1404 0 R 1421 0 R 1420 0 R 1437 0 R 1445 0 R 1454 0 R 1453 0 R 1464 0 R 1462 0 R 1463 0 R 1479 0 R 1488 0 R 1489 0 R 1487 0 R 1511 0 R 1519 0 R 1900 0 R ] endobj
在第 7316 行
1454 0 obj << /C [ 0.980392 0.803922 0.352941 ] /Border [ 0 0 0 ] /DA (/Helvetica 12 Tf 0 g) /F 4 /Subtype /Highlight /Type /Annot /Rect [ 371.6818 519.4665 500.5739 527.5641 ] /M (D:20200728132511Z00'00') /AP << /N 1455 0 R >> /Contents (why three? What happens with the other ones?) /QuadPoints [ 371.6818 527.5641 500.5739 527.5641 371.6818 519.4665 500.5739 519.4665 ] /T (Marco Langiu) >> endobj
- “1957 0” - (3 到 4 个参考)
在第 8953 行
1739 0 obj [ 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 1742 0 R 1741 0 R 1740 0 R 1757 0 R 1759 0 R 1760 0 R 1758 0 R 1791 0 R 1792 0 R 1793 0 R 1815 0 R 1823 0 R 1824 0 R 1957 0 R 1958 0 R ] endobj
在第 10179 行
1957 0 obj << /C [ 0.984314 0.360784 0.537255 ] /Border [ 0 0 0 ] /DA (/Helvetica 12 Tf 0 g) /F 4 /Subtype /Highlight /Type /Annot /Rect [ 499.8235 529.6356 527.8006 536.1137 ] /M (D:20200728151906Z00'00') /AP << /N 1959 0 R >> /Contents (Wall time would have been interesting as well!) /QuadPoints [ 499.8235 536.1137 527.8006 536.1137 499.8235 529.6356 527.8006 529.6356 ] /T (Marco Langiu) /Popup 1958 0 R >> endobj
在第 10186 行(直接在之前的参考之后)
1958 0 obj << /F 4 /Type /Annot /Rect [ 531.8006 540.1137 603.8006 576.1137 ] /DA (/Helvetica 12 Tf 0 g) /Parent 1957 0 R /Border [ 0 0 0 ] /M (D:20200728151910Z00'00') /C [ 0.984314 0.360784 0.537255 ] /Subtype /Popup >> endobj
在第 10698 行(可能不是实际参考)
0001021957 00000 n
解决方案
推荐阅读
- google-chrome-extension - 无法读取未定义的属性“查询”-在香草 Chrome 扩展中
- reactjs - 如何在使用 testRenderer 的测试中停止 React HTML 转义引号?
- c# - 在 API 过期之前更新/扩展 JWT
- c++ - 一组无 const 值的方法 find 不能用 const 值调用。const_cast 可以用来解决这个问题吗?
- python - 如何在python中完成50个动作(发送电子邮件)后告诉程序休眠60秒
- python - 有没有办法在带有循环的字典中自行生成相似的键名和值?
- java - 如何从 Java Springboot 执行复杂的 MongoDB 本机查询
- python - 抓取屏幕的特定部分并使其成为在 Python 中自我更新的图像
- python - 如何自动将照片上传到网站?
- git - Git:ftp不是命令