UserPassword недействителен после RemoveField при использовании itextSharp5.5.10 - PullRequest
1 голос
/ 06 августа 2020

Вот PDF-файл, для открытия которого требуется пароль, и я добавил к нему электронную подпись c. После этого для открытия файла по-прежнему требуется пароль. Но после того, как я использую AcroFields.RemoveField для удаления электронной подписи c, пароль для открытия файла больше не требуется. Это нормально? Как сохранить пароль при открытии файла PDF?

test pdf https://github.com/IYinxf/PDFs/blob/master/Encrypted.pdf

пароль 11111111

код

pdfReader = new PdfReader(strTempPath, Encoding.ASCII.GetBytes(strPassword));
if (!pdfReader.IsOpenedWithFullPermissions)
{
    return ERR_PERMISSION_DENIED;
}

AcroFields af = pdfReader.AcroFields;
bool rv = af.RemoveField(fieldName);

1 Ответ

1 голос
/ 07 августа 2020

Согласно коду, отвечающему за хранение информации о шифровании

if (reader.IsEncrypted() && (append || PdfReader.unethicalreading)) {
    crypto = new PdfEncryption(reader.Decrypt);
}

(PdfStamperImp конструктор)

это происходит только в том случае, если вы вводите штамп в режиме добавления или если установлен флаг unethicalreading.

При тестировании вашего кода в режиме добавления выясняется, что поле не удаляется. Это вызвано тем, что код удаления поля AcroFields неправильно отмечает правильные обновленные объекты в вашем PDF-файле как used . Когда вы делаете разметку вручную, все работает нормально:

using (var pdfReader = new PdfReader(file, Encoding.ASCII.GetBytes(strPassword)))
using (FileStream output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output, '\0', true))
{
    AcroFields af = pdfReader.AcroFields;
    bool rv = af.RemoveField(fieldName);
    pdfStamper.MarkUsed(pdfReader.Catalog);
    for (int pageNo = 1; pageNo <= pdfReader.NumberOfPages; pageNo++)
    {
        pdfStamper.MarkUsed(pdfReader.GetPageN(pageNo));
    }
}

Тестирование с флагом unethicalreading, установленным на true, работает "из коробки":

PdfReader.unethicalreading = true;
using (var pdfReader = new PdfReader(file, Encoding.ASCII.GetBytes(strPassword)))
using (FileStream output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output))
{
    AcroFields af = pdfReader.AcroFields;
    bool rv = af.RemoveField(fieldName);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...