我在两个不同的应用程序中使用PDFSharp,原因有两个。第一个是密码保护文件,第二个是水印文件。这些过程都可以在自己的应用程序/工作流程中单独工作。问题是应用程序1只知道密码,应用程序2只知道水印,应用程序1使用默认的所有者密码和动态用户密码,应用程序2打开带有所有者密码的文档以应用水印。问题是密码没有保留,看来PDFSharp在保存文档时忽略了以前的PDF密码?!
有没有办法在应用水印时保持安全设置,而无需再次明确定义密码?
我在PDFSharp论坛上发布了这个,但他们忽略了它,这不是一个好兆头?! http://forum.pdfsharp.net/viewtopic.php?f=2&t=2003&p=5737#p5737
亲切的问候,
答案 0 :(得分:4)
我认为这是PDF sharp的限制,因为我在论坛上没有得到他们的回应或帮助。我打开了代码并进行了以下更改以纠正错误。首先,我在SecurityHandler.cs类
上添加了一个新属性public string OwnerPassword
{
set { SecurityHandler.OwnerPassword = value; }
}
/// <summary>
/// TODO: JOSH
/// </summary>
public bool MaintainOwnerAndUserPassword
{
get { return SecurityHandler.MaintainOwnerAndUserPassword; }
set { SecurityHandler.MaintainOwnerAndUserPassword = value; }
}
然后我将PdfDocument.cs类上的doSave方法更改为如下所示:
void DoSave(PdfWriter writer)
{
if (this.pages == null || this.pages.Count == 0)
throw new InvalidOperationException("Cannot save a PDF document with no pages.");
try
{
bool encrypt = this.securitySettings.DocumentSecurityLevel != PdfDocumentSecurityLevel.None;
if (encrypt)
{
PdfStandardSecurityHandler securityHandler = this.securitySettings.SecurityHandler;
if (securityHandler.Reference == null)
this.irefTable.Add(securityHandler);
else
Debug.Assert(this.irefTable.Contains(securityHandler.ObjectID));
this.trailer.Elements[PdfTrailer.Keys.Encrypt] = this.securitySettings.SecurityHandler.Reference;
}
else
this.trailer.Elements.Remove(PdfTrailer.Keys.Encrypt);
PrepareForSave();
if (encrypt && !securitySettings.SecurityHandler.MaintainOwnerAndUserPassword)
this.securitySettings.SecurityHandler.PrepareEncryption();
...
最后,我将PDFSecuritySettings.cs上的CanSave方法更改为:
internal bool CanSave(ref string message)
{
if (this.documentSecurityLevel != PdfDocumentSecurityLevel.None)
{
if ((SecurityHandler.userPassword == null || SecurityHandler.userPassword.Length == 0) &&
(SecurityHandler.ownerPassword == null || SecurityHandler.ownerPassword.Length == 0) &&
!SecurityHandler.MaintainOwnerAndUserPassword)
{
message = PSSR.UserOrOwnerPasswordRequired;
return false;
}
}
return true;
}
这应该允许你设置MaintainOwnerAndUserPassword设置,并假设你已经有一个哈希的用户名和密码,它应该工作得很好,花花公子,
过度和完全。