0

PDFテンプレートを使用するこのチュートリアルhttp://www.4guysfromrolla.com/articles/030211-1.aspxを使用しているため、ユーザーはテキストボックスを使用してフィールドに入力できます。ファイルはクライアントのPCにダウンロードされますが、ファイルのコピーをSQLデータベースにも保存するか、両方ではなくデータベースにファイルを保存したいと思います。

protected void btnGeneratePDF_Click(object sender, EventArgs e)
{
    var pdfPath = Path.Combine(Server.MapPath("~/PDFTemplates/fw9.pdf"));

    // Get the form fields for this PDF and fill them in!
    var formFieldMap = PDFHelper.GetFormFieldNames(pdfPath);
    formFieldMap["topmostSubform[0].Page1[0].f1_01_0_[0]"] = txtName.Text;
    formFieldMap["topmostSubform[0].Page1[0].f1_02_0_[0]"] = txtBusinessName.Text;

    if (rblTaxClassification.SelectedValue != null)
    {
        var formFieldName = string.Format("topmostSubform[0].Page1[0].c1_01[{0}]", rblTaxClassification.SelectedIndex);
        formFieldMap[formFieldName] = (rblTaxClassification.SelectedIndex + 1).ToString();
    }

    if (chkExemptPayee.Checked)
        formFieldMap["topmostSubform[0].Page1[0].c1_01[7]"] = "8";
        

    formFieldMap["topmostSubform[0].Page1[0].f1_04_0_[0]"] = txtAddress.Text;
    formFieldMap["topmostSubform[0].Page1[0].f1_05_0_[0]"] = txtCityStateZIP.Text;
    formFieldMap["topmostSubform[0].Page1[0].f1_07_0_[0]"] = txtAccountNumbers.Text;

    // Requester's name and address (hard-coded)
    formFieldMap["topmostSubform[0].Page1[0].f1_06_0_[0]"] = "Acme Website\n123 Anywhere Lane\nSpringfield, USA";

    // SSN
    if (!string.IsNullOrEmpty(txtSSN1.Text))
    {
        formFieldMap["topmostSubform[0].Page1[0].social[0].TextField1[0]"] = txtSSN1.Text;
        formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[0]"] = txtSSN2.Text;
        formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[1]"] = txtSSN3.Text;
    }
    else if (!string.IsNullOrEmpty(txtEIN1.Text))
    {
        formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[2]"] = txtEIN1.Text;
        formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[3]"] = txtEIN2.Text;
    }

    var pdfContents = PDFHelper.GeneratePDF(pdfPath, formFieldMap);

    PDFHelper.ReturnPDF(pdfContents, "Completed-W9.pdf");

    FileStream fs = new FileStream(pdfPath, FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);
    Byte[] bytes = br.ReadBytes((Int32)fs.Length);
    br.Close();
    fs.Close();

    //insert the file into database
    string strQuery = "insert into tblFiles(Name, ContentType, Data) values (@Name, @ContentType, @Data)";
    SqlCommand cmd = new SqlCommand(strQuery);
    cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Completed-W9132.pdf";
    cmd.Parameters.Add("@ContentType", SqlDbType.VarChar).Value = "application/pdf";
    cmd.Parameters.Add("@Data", SqlDbType.Binary).Value = bytes;
    InsertUpdateData(cmd);

App_code/pdfHelper.cs

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

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

    // See http://stackoverflow.com/questions/4491156/get-the-export-value-of-a-checkbox-using-itextsharp/
    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);
            // /D is for the "down" appearances.

            // if there are normal appearances, one key will be "Off", and the other
            // will be the export value... there should only be two.
            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!
            }
        }

        // if that doesn't work, there might be an /AS key, whose value is a name with 
        // the export value, again with a leading '/', 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

1 に答える 1

1

その場合に探しているチュートリアルの部分は、ここにあります。

Response.ContentType = "application/pdf";
Response.BinaryWrite(output.ToArray());

「ファイル」をデータベースに保存するときは、基本的に次の 2 つ (おそらく 3 つ) のことを気にします。

  • ファイル内容のバイト配列
  • ファイルのタイプ
  • (おそらくファイルの名前)

チュートリアルはこれらのうちの 2 つ (上記) である型とデータで終了するため、これら 2 つをデータベースに格納することができますが、それらを格納する必要があります。これは、使用しているデータベース、そのデータベースへのアクセス方法などによって異なります。基本的に、これら 2 つのものを格納するには、テキスト列 ( varchar?) とバイナリ (または "blob") 列 ( varbinary?) が必要です。

唯一の違いは、タイプを HTTP 応答のヘッダーとして設定し、その HTTP 応答にバイトを書き込む代わりに、両方をデータベースの値として使用していることです。他のすべては同じです。

于 2013-09-16T13:17:08.703 に答える