1

こんにちは、私のアプリケーションは MVC3 c# です。itextsharp を使用して、事前に設計されたフォームの PDF ファイルを生成しています。このアプリケーションでは、さまざまなフォームを使用する必要があります。私が使用するフォームを生成するには:

public ActionResult TestPDF(long learnerID = 211, long courseID = 11)
{
    var caseList = _studyCaseSvc.ListStudyCases().Where(x => x.Course_ID == courseID);
    try
    {
        MemoryStream memoryStream = new MemoryStream();
        PdfConcatenate whole = new PdfConcatenate(memoryStream);
        foreach (var ca in caseList)
        {
            byte[] part = null;
            if (ca.CaseType == "CTA")
            {
                part = GenerateEvaluationCAT_PDF(learnerID, ca.ID);
            }
            else if (ca.CaseType == "CTAH")
            {
                part = GenerateEvaluationCATH_PDF(learnerID, ca.ID);
            }
            else
            {
                part = null;
            }
            if (part != null)
            {
                PdfReader partReader = new PdfReader(part);
                whole.AddPages(partReader);
                partReader.Close();
            }
        }

        whole.Close();
        byte[] byteInfo = memoryStream.ToArray();
        SendPdfToBrowser(byteInfo);
    }
    catch (Exception ex)
    {
    }
    return null;
}

次のエラーが表示されます: 同じキーを持つアイテムが既に追加されています。エラーは AddPages で発生します。だから私はこのより簡単なテストを開発しました:

private void merge()
    {
        try
        {
            FileStream output = new FileStream("p3.pdf", FileMode.Create);
            PdfConcatenate pdfConcatenate = new PdfConcatenate(output, true);

            PdfReader r1 = new PdfReader("p2.pdf");

            MemoryStream memoryStream = new MemoryStream();
            PdfStamper pdfStamper = new PdfStamper(r1, memoryStream);

            pdfStamper.FormFlattening = true;
            pdfStamper.Close();
            PdfReader r2 = new PdfReader(memoryStream.ToArray());

            //pdfConcatenate.AddPages(tempReader);

            pdfConcatenate.Open();
            int n = r1.NumberOfPages;
            for (int i = 1; i <= n; i++)
            {
                PdfImportedPage imp = pdfConcatenate.Writer.GetImportedPage(r1, i);
                pdfConcatenate.Writer.AddPage(imp);
            }
            pdfConcatenate.Writer.FreeReader(r1);

            pdfStamper.Close();
            r1.Close();
            pdfConcatenate.Close();
        }
        catch (Exception ex)
        {
        }
    }

同じエラー。

4

1 に答える 1

1

問題は、複数の PDF ファイルを連結するだけで 1 つに結合できるという誤解です。これは PDF では正しくありません (ほとんどのバイナリ ファイル形式で間違っているのと同じように)。

したがって、GenerateAllEvaluation_PDF メソッドを更新して、バイト配列全体ではなく PdfConcatenate インスタンスを持つようにする必要があります。http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfConcatenate.htmlで、GenerateEvaluationCATH_PDF メソッドによって返された各バイト配列を PdfReader で開き、これらのリーダーのすべてのページを PdfConcatenate に追加して、最終的にそのクラスによって生成されたバイト。

EDIT(私はC#よりもJavaに興味があるので、マイナーなエラーを許してください)

PdfConcatenate whole = new PdfConcatenate(...);
foreach (var ca in caseList)
{
    byte[] part = null;
    if (ca.CaseType == "CTA")
    {
        part = GenerateEvaluationCAT_PDF(learnerID, ca.ID);
    }
    else if (ca.CaseType == "CTAH")
    {
        part = GenerateEvaluationCATH_PDF(learnerID, ca.ID);
    }
    else
    {
        part = ???;
    }
    PdfReader partReader = new PdfReader(part);
    whole.AddPages(partReader);
    partReader.Close();
}

PdfConcatenate は、最終バイト [] を取得できる MemoryStream で構築できます。

PS : PdfConcatenateiTextSharp バージョン 4.x にはまだ含まれていない可能性がありますが、これは単に PdfCopy と PdfSmartCopy の便利なラッパーです。したがって、単に iTextSharp (結局 OSS) のソースを見て、インスピレーションを得ることができます: PdfConcatenate.cs

于 2012-11-18T06:12:32.817 に答える