2

、などのフォーム要素iTextSharpを持つページのマージもサポートする1​​つに複数のpdfページをマージするにはどうすればよいですか?textboxescheckboxes

私はグーグルで非常に多くのことを試しましたが、何もうまくいきませんでした。

4

4 に答える 4

7

ここで私の答えを参照してくださいMerging Memory Streams . PDF を itextsharp とマージする方法の例を示します。

フォーム フィールド名を更新するには、スタンパーを使用してフォーム フィールド名を変更するこのコードを追加します。

/// <summary>
/// Merges pdf files from a byte list
/// </summary>
/// <param name="files">list of files to merge</param>
/// <returns>memory stream containing combined pdf</returns>
public MemoryStream MergePdfForms(List<byte[]> files)
{
    if (files.Count > 1)
    {
        string[] names;
        PdfStamper stamper;
        MemoryStream msTemp = null;
        PdfReader pdfTemplate = null;
        PdfReader pdfFile;
        Document doc;
        PdfWriter pCopy;
        MemoryStream msOutput = new MemoryStream();

        pdfFile = new PdfReader(files[0]);

        doc = new Document();
        pCopy = new PdfSmartCopy(doc, msOutput);
        pCopy.PdfVersion = PdfWriter.VERSION_1_7;

        doc.Open();

        for (int k = 0; k < files.Count; k++)
        {
            for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
            {
                msTemp = new MemoryStream();
                pdfTemplate = new PdfReader(files[k]);

                stamper = new PdfStamper(pdfTemplate, msTemp);

                names = new string[stamper.AcroFields.Fields.Keys.Count];
                stamper.AcroFields.Fields.Keys.CopyTo(names, 0);
                foreach (string name in names)
                {
                    stamper.AcroFields.RenameField(name, name + "_file" + k.ToString());
                }

                stamper.Close();
                pdfFile = new PdfReader(msTemp.ToArray());
                ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
                pCopy.FreeReader(pdfFile);
            }
        }

        pdfFile.Close();
        pCopy.Close();
        doc.Close();

        return msOutput;
    }
    else if (files.Count == 1)
    {
        return new MemoryStream(files[0]);
    }

    return null;
}
于 2013-03-20T12:51:44.350 に答える
3

以下は、名前空間が追加され、スタンプが削除された、Jonathan の Merge コードの単純化されたバージョンです。

public IO.MemoryStream MergePdfForms(System.Collections.Generic.List<byte[]> files)
{
    if (files.Count > 1) {
        using (System.IO.MemoryStream msOutput = new System.IO.MemoryStream()) {
            using (iTextSharp.text.Document doc = new iTextSharp.text.Document()) {
                using (iTextSharp.text.pdf.PdfSmartCopy pCopy = new iTextSharp.text.pdf.PdfSmartCopy(doc, msOutput) { PdfVersion = iTextSharp.text.pdf.PdfWriter.VERSION_1_7 }) {
                    doc.Open();
                    foreach (byte[] oFile in files) {
                        using (iTextSharp.text.pdf.PdfReader pdfFile = new iTextSharp.text.pdf.PdfReader(oFile)) {
                            for (i = 1; i <= pdfFile.NumberOfPages; i++) {
                                pCopy.AddPage(pCopy.GetImportedPage(pdfFile, i));
                                pCopy.FreeReader(pdfFile);
                            }
                        }
                    }
                }
            }

            return msOutput;
        }
    } else if (files.Count == 1) {
        return new System.IO.MemoryStream(files[0]);
    }

    return null;
}
于 2014-10-14T22:55:57.907 に答える
2

PDF をマージするには、 「itextsharp を使用して 2 つの PDF ページを 1 つにマージする」を参照してください。

于 2013-03-20T12:43:27.397 に答える
1

以下は、pdf merging の私のコードです。Jonathan さんフィールドの名前を変更する提案をしてくれてありがとう。これにより、pdf ページをフォーム フィールドとマージする際の問題が解決されました。

 private static void CombineAndSavePdf(string savePath, List<string> lstPdfFiles)
    {
        using (Stream outputPdfStream = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.None))
        {

            Document document = new Document();
            PdfSmartCopy copy = new PdfSmartCopy(document, outputPdfStream);
            document.Open();
            PdfReader reader;
            int totalPageCnt;
            PdfStamper stamper;
            string[] fieldNames;
            foreach (string file in lstPdfFiles)
            {
                reader = new PdfReader(file);
                totalPageCnt = reader.NumberOfPages;
                for (int pageCnt = 0; pageCnt < totalPageCnt; )
                {
                     //have to create a new reader for each page or PdfStamper will throw error
                    reader = new PdfReader(file);
                    stamper = new PdfStamper(reader, outputPdfStream);
                    fieldNames = new string[stamper.AcroFields.Fields.Keys.Count];
                    stamper.AcroFields.Fields.Keys.CopyTo(fieldNames, 0);
                    foreach (string name in fieldNames)
                    {
                        stamper.AcroFields.RenameField(name, name + "_file" + pageCnt.ToString());
                    }
                    copy.AddPage(copy.GetImportedPage(reader, ++pageCnt));                     
                }
                copy.FreeReader(reader);                    
            }
            document.Close();
        }
    }
于 2013-03-20T15:40:49.977 に答える