Это похоже на то, что нужно делать быстро, но на практике, похоже, проблема. У меня есть куча PDF-форм, которые включают поля формы и встроенный javascript. Я хотел бы удалить код javascript безопасно, но оставить поля формы PDF неповрежденными.Удалить Javascript из PDF с помощью iTextSharp
До сих пор я мог найти множество решений, но все решения либо устранили как поля javascript, так и поля формы или остались без изменений.
Вот решение A; он копирует как поля формы и JavaScript:
var pdfReader = new PdfReader(infilename);
using (MemoryStream memoryStream = new MemoryStream()) {
PdfCopyFields copy = new PdfCopyFields(memoryStream);
copy.AddDocument(pdfReader);
copy.Close();
File.WriteAllBytes(rawfilename, memoryStream.ToArray());
}
С другой стороны, у меня есть решение B, что обрезает оба поля формы и JavaScript:
Document document = new Document();
using (MemoryStream memoryStream = new MemoryStream()) {
PdfWriter writer = PdfWriter.GetInstance(document, memoryStream);
document.Open();
document.AddDocListener(writer);
for (int p = 1; p <= pdfReader.NumberOfPages; p++) {
document.SetPageSize(pdfReader.GetPageSize(p));
document.NewPage();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage pageImport = writer.GetImportedPage(pdfReader, p);
int rot = pdfReader.GetPageRotation(p);
if (rot == 90 || rot == 270) {
cb.AddTemplate(pageImport, 0, -1.0F, 1.0F, 0, 0, pdfReader.GetPageSizeWithRotation(p).Height);
} else {
cb.AddTemplate(pageImport, 1.0F, 0, 0, 1.0F, 0, 0);
}
}
document.Close();
File.WriteAllBytes(rawfile, memoryStream.ToArray());
}
Кто-нибудь знает, как изменить либо раствор А или В устранить javascript, но оставить поля формы на месте?
EDIT: Код решения находится здесь!
using (MemoryStream memoryStream = new MemoryStream()) {
PdfStamper stamper = new PdfStamper(pdfReader, memoryStream);
for (int i = 0; i <= pdfReader.XrefSize; i++) {
object o = pdfReader.GetPdfObject(i);
PdfDictionary pd = o as PdfDictionary;
if (pd != null) {
pd.Remove(PdfName.AA);
pd.Remove(PdfName.JS);
pd.Remove(PdfName.JAVASCRIPT);
}
}
stamper.Close();
pdfReader.Close();
File.WriteAllBytes(rawfile, memoryStream.ToArray());
}
Спасибо! Позвольте мне попробовать и посмотреть, как это происходит. –
Успех! Это сделало работу. Позвольте мне изменить ваш ответ, чтобы точно указать, как читается окончательный код. –
@TedSpence Когда я увидел ваше предложение по редактированию, оно уже было отклонено как * неправильное или попытка ответить или прокомментировать существующее сообщение. * Я включил его здесь, но должен добавить, что ваше решение перехватывает, потому что оно касается каждого и каждый косвенный словарь. С другой стороны, он игнорирует встроенные словари. – mkl