2

これはすぐに実行できるように思えますが、実際には問題があるようです。フォーム フィールドと埋め込まれた JavaScript を含む PDF フォームがたくさんあります。JavaScript コードを安全に削除したいのですが、PDF フォーム フィールドはそのままにしておきます。

これまでのところ、多くの解決策を見つけることができましたが、すべての解決策で、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());
}

別の方法として、フォーム フィールドと JavaScript の両方を削除するソリューション B があります。

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());
}

ソリューション A または B のいずれかを変更して 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());
}
4

2 に答える 2

0

for ループの後に次の行を追加して、AcroForm を保持します。

var form = pdfReader.AcroForm;
if (form != null)
   writer.CopyAcroForm(reader);
于 2013-05-07T03:55:20.737 に答える