1

記入可能なPDFがあります。テキストボックスがほとんどありません。

次のコード(itextsharp)を使用してこれらのフィールドに入力します。

 DataTable dt = new DataTable();
            String pdfPath1 = Server.MapPath("pdfs\\transmittal2.pdf");
            if (File.Exists(pdfPath1))
            {                  

                dt = objClsTransmittal.GetTransmittal(jobid, cid);
                String comment = "Correspondence generated for " + dt.Rows[0]["Recipient"].ToString();                  
                var formfield = PDFHelper.GetFormFieldNames(pdfPath1);
                formfield["DocDate"] = DateTime.Now.ToLongDateString();
                formfield["Address1"] = dt.Rows[0]["Company"].ToString();
                formfield["Address2"] = dt.Rows[0]["Address1"].ToString();
                formfield["PropertyAddress"] = dt.Rows[0]["PropertyAddress"].ToString();
                formfield["Job"] = dt.Rows[0]["JobID"].ToString();
                formfield["Name"] = dt.Rows[0]["Recipient"].ToString();
                formfield["CityStateZip"] = dt.Rows[0]["address2"].ToString();
                formfield["E-mail"] = dt.Rows[0]["Email"].ToString();
                var pdfcontent = PDFHelper.GeneratePDF(pdfPath1, formfield);                    
                PDFHelper.ReturnPDF(pdfcontent, "Transmittal.pdf");

            }

現在、読み取り専用のpdfとしてダウンロードされています。

このpdfがダウンロードされたとき、私はすべてのフィールドがpdfで入力したテキストで入力可能なままであることを望みます。テキストを編集できるようにします。

お返事をお待ちしております。

ありがとう。

編集

PdfHelperは私のカスタムクラスです。私は次のコードを使用しました:

  using System;
   using System.Collections.Generic;
  using System.Collections;
  using System.Linq;
  using System.Web;
   using System.IO;
   using iTextSharp.text.pdf;

  public class PDFHelper
  {
    public static Dictionary<string, string> GetFormFieldNames(string pdfPath)
    {
    var fields = new Dictionary<string, string>();

    var reader = new PdfReader(pdfPath);
    foreach (DictionaryEntry entry in reader.AcroFields.Fields)
        fields.Add(entry.Key.ToString(), string.Empty);
    reader.Close();

    return fields;
}

public static byte[] GeneratePDF(string pdfPath, Dictionary<string, string> formFieldMap)
{
    var output = new MemoryStream();
    var reader = new PdfReader(pdfPath);
    var stamper = new PdfStamper(reader, output);
    var formFields = stamper.AcroFields;

    foreach (var fieldName in formFieldMap.Keys)
        formFields.SetField(fieldName, formFieldMap[fieldName]);

    stamper.FormFlattening = true;
    stamper.Close();
    reader.Close();

    return output.ToArray();
}


public static string GetExportValue(AcroFields.Item item)
{
    var valueDict = item.GetValue(0);
    var appearanceDict = valueDict.GetAsDict(PdfName.AP);

    if (appearanceDict != null)
    {
        var normalAppearances = appearanceDict.GetAsDict(PdfName.N);

        if (normalAppearances != null)
        {
            foreach (var curKey in normalAppearances.Keys)
                if (!PdfName.OFF.Equals(curKey))
                    return curKey.ToString().Substring(1); // string will have a leading '/' character, so remove it!
        }
    }


    var curVal = valueDict.GetAsName(PdfName.AS);
    if (curVal != null)
        return curVal.ToString().Substring(1);
    else
        return string.Empty;
}

public static void ReturnPDF(byte[] contents)
{
    ReturnPDF(contents, null);
}

public static void ReturnPDF(byte[] contents, string attachmentFilename)
{
    var response = HttpContext.Current.Response;

    if (!string.IsNullOrEmpty(attachmentFilename))
        response.AddHeader("Content-Disposition", "attachment; filename=" + attachmentFilename);

    response.ContentType = "application/pdf";
    response.BinaryWrite(contents);
    response.End();
}
4

2 に答える 2

7

あなたのコード行

stamper.FormFlattening = true;

フォームフィールドをフラット化するようにiTextSharpに指示します。つまり、フォームフィールドをページコンテンツに統合し、フォームフィールドの注釈を削除します。

フォームフィールドを編集可能なフィールドとして保持したいので、フォームをフラット化しないでください。

于 2013-03-14T23:16:59.500 に答える
-2

エラー:PDFHelper.csでタイプを変換できません

public static Dictionary<string, string> GetFormFieldNames(string pdfPath)
    {
        var fields = new Dictionary<string, string>();

        var reader = new PdfReader(pdfPath);
        foreach (DictionaryEntry entry in reader.AcroFields.Fields) //ERROR: 'System.Collections.Generic.KeyValuePair' to 'System.Collections.DictionaryEntry'
        {
            fields.Add(entry.Key.ToString(), string.Empty);
        }
        reader.Close();

        return fields;
    }

'System.Collections.Generic.KeyValuePair'から'System.Collections.DictionaryEntry'

于 2013-03-19T08:13:05.033 に答える