0

C# を使用して PDF ファイルを作成するために iTextSharp を使用しています。しかし、作成したPDFファイルをPDFエディタで編集しているのですが、うまく編集できていません。 iTextSharp を使用して編集可能な PDF ファイルを作成します。

editable PDF filesiTextSharp を使用して PDF ファイルを作成するときに作成するために追加する (PDF ドキュメントを編集可能にするための) パラメータはありますか?

この問題から抜け出す方法を教えてください。

4

2 に答える 2

2

あなたが探しているものは明らかではありません。

PDF は、テキストを編集するための形式ではありません。Chapter 6「iText in Action」のイントロを読んでください。http://www.manning.com/lowagie2/samplechapter6.pdf .

ただし、インタラクティブな PDF を作成する方法があります。

を参照するsection 6.3.5と、インタラクティブ フォームの 1 種類である AcroForm テクノロジに基づくフォームについて学習できます。ではsection 6.3.5、このようなフォームは OpenOffice を使用して作成されます。

ではchapter 8、iText を使用して AcroForm フォームを作成する方法を学習します。もちろん、そのような形式では、すべての座標が固定されています。四角形が定義され、四角形に収まらないコンテンツは、縮小 (フォント = 0 の場合) または切り取ることができます。それがあなたが説明していることだと思いますが、あなたはあまり明確ではありません。

別のタイプのフォームは に基づいていXML Forms Architectureます。この場合、PDF は XML のコンテナーとして機能します。を使用して、このようなフォームを作成できますAdobe LiveCycle Designer。自動化されたプロセスでそのようなフォームを作成できる「ライブラリ」は知りません。iTextSharp は、そのようなフォームに XML を挿入してそれらを埋めることができます。XFA Workerまた、 XFA フォームをフラット化できるという名前のクローズド ソース製品もあります。

于 2012-09-07T08:04:21.783 に答える
1

まず、あなたの質問はそれほど明確ではありません。次に、C#コードだけからPDFを作成しようとしていると思います。

これを視覚的に改善する方法は、Open Officeを作成するために使用することPDF templateです。次に、テンプレートを使用した後、テンプレートで作成した編集可能なフィールドに書き込みます。これがあなたを助けるためのいくつかのコードです:

public class DocumentDownload : PdfTemplateHandler 
{

    protected override string TemplatePath
    {
        get { return "~/App_Data/PdfTemplates/MyDocument_2011_v1.pdf"; }
    }

    protected override void LoadDataInternal()
    {

        documentType = Request["docType"] != null ? Request["docType"].ToString() : "";

        if (uid.Length < 1)
        {
            Response.Write("Invalid request!");
            Response.End();
        }
        // load data

        DownloadFileName = string.Format("MyDocument_{0}_{1}.pdf", 1234, DateTime.Now.ToBinary());
    }

    protected override void SetFieldsInternal(iTextSharp.text.pdf.AcroFields acroFields)
    {

        //iTextSharp.text.pdf.BaseFont unicode = iTextSharp.text.pdf.BaseFont.createFont(unicodeFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);            
        //var unicodeFont = iTextSharp.text.pdf.BaseFont.CreateFont(iTextSharp.text.FontFactory.TIMES_ROMAN, iTextSharp.text.pdf.BaseFont.IDENTITY_H, iTextSharp.text.pdf.BaseFont.EMBEDDED);
        acroFields.SetField("txtrNumber", Number.ToString());

        acroFields.SetField("cbTaxi", "Yes");

    }
}


public abstract class PdfTemplateHandler : IHttpHandler
{
    public virtual bool DownloadAsAttachment
    {
        get
        {
            return true;
        }
    }

    protected virtual TimeSpan PdfTemplateCacheDuration
    {
        get
        {
            return TimeSpan.FromMinutes(30);
        }
    }

    protected virtual string PdfTemplateCacheKey
    {
        get
        {
            return string.Format("__PDF_Template[{0}]", TemplatePath);
        }
    }

    protected string DownloadFileName { get; set; }

    protected HttpContext Context { get; private set; }

    protected HttpResponse Response { get; private set; }

    protected HttpRequest Request { get; private set; }

    #region IHttpHandler Members

    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {

        Context = context;
        Response = context.Response;
        Request = context.Request;

        try
        {
            LoadDataInternal();
        }
        catch (ThreadAbortException)
        {
            // no-op
        }
        catch (Exception ex)
        {
            //Logger.LogError(ex);
            Response.Write("Error!");
            Response.End();
        }

        Response.BufferOutput = true;
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";

        if (DownloadAsAttachment)
        {
            Response.AddHeader("Content-Disposition", "attachment; filename=" +
                (string.IsNullOrEmpty(DownloadFileName) ? context.Session.SessionID + ".pdf" : DownloadFileName));
        }

        PdfStamper pst = null;
        try
        {
            PdfReader reader = new PdfReader(GetTemplateBytes());
            pst = new PdfStamper(reader, Response.OutputStream);
            var acroFields = pst.AcroFields;

            pst.FormFlattening = true;
            pst.FreeTextFlattening = true;
            pst.SetFullCompression();

            SetFieldsInternal(acroFields);
            pst.Close();
        }
        finally
        {
            if (pst != null)
                pst.Close();
        }
    }

    #endregion

    #region Abstract Members for overriding and providing functionality

    protected abstract string TemplatePath { get; }

    protected abstract void LoadDataInternal();

    protected abstract void SetFieldsInternal(AcroFields acroFields);

    #endregion

    protected virtual byte[] GetTemplateBytes()
    {
        var data = Context.Cache[PdfTemplateCacheKey] as byte[];
        if (data == null)
        {
            data = File.ReadAllBytes(Context.Server.MapPath(TemplatePath));
            Context.Cache.Insert(PdfTemplateCacheKey, data,
                null, DateTime.Now.Add(PdfTemplateCacheDuration), Cache.NoSlidingExpiration);
        }
        return data;
    }

    protected static string unicode_iso8859(string src)
    {
        Encoding iso = Encoding.GetEncoding("iso8859-2");
        Encoding unicode = Encoding.UTF8;
        byte[] unicodeBytes = unicode.GetBytes(src);
        return iso.GetString(unicodeBytes);
    }
    protected static string RemoveDiacritics(string stIn)
    {
        string stFormD = stIn.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        for (int ich = 0; ich < stFormD.Length; ich++)
        {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
            if (uc != UnicodeCategory.NonSpacingMark)
            {
                sb.Append(stFormD[ich]);
            }
        }

        return (sb.ToString().Normalize(NormalizationForm.FormC));
    }

}

PDFテンプレートはキャッシュ可能です。デバッグするときは、このことに注意してください。

于 2012-09-07T07:56:45.650 に答える