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 文件将它们合并为一个的误解。这对于 PDF 是错误的(就像大多数二进制文件格式是错误的一样)。

因此,您应该更新 GenerateAllEvaluation_PDF 方法以具有 PdfConcatenate 实例而不是整个字节数组,参见。http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfConcatenate.html,在 PdfReader 中打开 GenerateEvaluationCATH_PDF 方法返回的每个字节数组,将这些阅读器的所有页面添加到 PdfConcatenate 并最终返回该类生成的字节。

编辑(我更喜欢Java而不是C#,因此请原谅小错误)

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 构建,您可以从中检索最终字节 []。

PSPdfConcatenate可能还不是 iTextSharp 4.x 版的一部分,但它只是 PdfCopy 和 PdfSmartCopy 的便捷包装器。因此,您可能只需查看 iTextSharp 的来源(毕竟是 OSS)并受到启发:PdfConcatenate.cs

于 2012-11-18T06:12:32.817 回答