adobe reader如何在不知道密码的情况下获取内容
Posted
技术标签:
【中文标题】adobe reader如何在不知道密码的情况下获取内容【英文标题】:How do adobe reader get the content without knowing the password 【发布时间】:2013-12-13 07:38:21 【问题描述】:最近,我从朋友那里得到了一个 PDF 文件,我用我的 Adobe Reader X 打开它,我在标题栏上看到了一个安全的注释。我找到这个文件的属性,它说这个文件的安全方法是“密码安全”,PDF版本是1.7 8级。我不能在不知道这个文件密码的情况下编辑它。
由于阅读器 X 在没有询问我密码的情况下打开文件,内容不应该被加密,阅读器 X 只是遵循一个协议,它告诉它不允许人们编辑文件。所以如果有人写了一个不遵循协议的程序,密码就没有用了。然后我对这个问题感到困惑,是否可以编写那个程序?如果不是,我一定是错的,pdf的内容必须加密。
但另一个问题是:Adobe Reader 是如何在不知道密码的情况下获取内容的?
非常感谢。
PS:我找到了一些 PDF 密码删除程序,并在这个 PDF 文件上尝试了它们,它们都不起作用,这就是我将文件格式的版本放在问题中的原因。另外,我只能用 Adobe Reader X 及更高版本打开这个文件。所以我认为 Adobe 已经改变了加密算法。
【问题讨论】:
很难谈论您拥有但未提供的特定文件。话虽如此,这听起来像是使用默认密码作为用户密码的普通 PDF 安全性。也许它只是使用了一种加密算法,这种加密算法最近才被引入到带有 Adobe 扩展的 PDF 中,因此你发现的密码删除程序还不知道。 密码用于加密文件中的每个对象,因此 Adobe 无法在没有密码的情况下打开它。所以它必须是默认值。请记住,有 2 个密码(用户和所有者)。 【参考方案1】:正如您正确指出的那样,该文档没有得到有效加密 - 它是一种 DRM,即使用已知密钥对其进行混淆/加密,他们希望每个能够读取它的软件都会应用这些限制。 (可能会在软件中应用大量律师。)
也就是说,iTextPDF 库 (download here) 有一个名为 unethicalreading
的 public static boolean
和 the documentation 声明“如果您决定更改此静态参数的值,iText 开发人员概不负责。”
我不确定 iTextPDF 是否支持 PDF 1.7(这就是您的密码删除程序不起作用的原因 - 它们只支持旧格式),但如果支持,以下软件将解析未受保护的 PDF 文件或你提供一个密码,然后写一个新的。如果您决定更改main()
方法的第一行中某个参数的某个赋值,我概不负责...
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
public class PDFOpener
/**
* @param args
* @throws IOException
* @throws DocumentException
*/
public static void main(String[] args) throws IOException, DocumentException
PdfReader.unethicalreading = false;
if (args.length == 0 || args.length > 3 || !args[0].endsWith(".pdf"))
usage();
String infile = args[0];
String outfile = args.length >= 2 ?
args[1] : infile.substring(0, infile.length()-4) + ".open.pdf";
System.err.println("Reading: " +infile);
System.err.println("Writing: " +outfile);
PdfReader reader = null;
if (args.length == 3)
reader = new PdfReader(args[0], args[2].getBytes(Charset.forName("UTF-8")));
else
reader = new PdfReader(args[0]);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outfile));
stamper.close();
private static void usage()
System.err.println("Usage: pdfopener infile.pdf [outfile.pdf] [password]");
System.exit(1);
您需要同时下载 iText 和“额外的 jars”,并将它们放在类路径中的某个位置。
【讨论】:
我发现了这个 ISO 32000-2 标准,这可能是它的原因。 iso.org/iso/catalogue_detail.htm?csnumber=63534以上是关于adobe reader如何在不知道密码的情况下获取内容的主要内容,如果未能解决你的问题,请参考以下文章
用adobe reader 打开一个pdf文档,点击了文档里链接到本文档的链接,如何回到上一个位置
如何永久更改 Adobe Acrobat Reader DC 中的荧光笔颜色?