当前位置: 首页 > 知识库问答 >
问题:

如何合并多个pdf文件(运行时生成)?

燕博文
2023-03-14

如何通过< code>ItextSharp合并多个pdf文件(运行时生成),然后打印它们。

我找到了下面的链接,但考虑到存储的pdf文件不是我的情况,该方法需要pdf名称。

我有多个报告,我将通过以下方法将它们转换为< code>pdf文件:

private void AddReportToResponse(LocalReport followsReport)
{
    string mimeType;
    string encoding;
    string extension;
    string[] streams = new string[100];
    Warning[] warnings = new Warning[100];
    byte[] pdfStream = followsReport.Render("PDF", "", out mimeType, out encoding, out extension, out streams, out warnings);
  //Response.Clear();
  //Response.ContentType = mimeType;
  //Response.AddHeader("content-disposition", "attachment; filename=Application." + extension);
  //Response.BinaryWrite(pdfStream);
  //Response.End();
}

现在我想将所有生成的文件(字节)合并到一个pdf文件中以打印它

共有3个答案

艾敏学
2023-03-14

这是我从一个旧项目中提取的一些代码。这是一个web应用程序,但我使用iTextSharp合并pdf文件,然后打印它们。

public static class PdfMerger
    {
        /// <summary>
        /// Merge pdf files.
        /// </summary>
        /// <param name="sourceFiles">PDF files being merged.</param>
        /// <returns></returns>
        public static byte[] MergeFiles(List<Stream> sourceFiles)
        {
            Document document = new Document();
            MemoryStream output = new MemoryStream();

            try
            {
                // Initialize pdf writer
                PdfWriter writer = PdfWriter.GetInstance(document, output);
                writer.PageEvent = new PdfPageEvents();

                // Open document to write
                document.Open();
                PdfContentByte content = writer.DirectContent;

                // Iterate through all pdf documents
                for (int fileCounter = 0; fileCounter < sourceFiles.Count; fileCounter++)
                {
                    // Create pdf reader
                    PdfReader reader = new PdfReader(sourceFiles[fileCounter]);
                    int numberOfPages = reader.NumberOfPages;

                    // Iterate through all pages
                    for (int currentPageIndex = 1; currentPageIndex <=
                                        numberOfPages; currentPageIndex++)
                    {
                        // Determine page size for the current page
                        document.SetPageSize(
                            reader.GetPageSizeWithRotation(currentPageIndex));

                        // Create page
                        document.NewPage();
                        PdfImportedPage importedPage =
                            writer.GetImportedPage(reader, currentPageIndex);


                        // Determine page orientation
                        int pageOrientation = reader.GetPageRotation(currentPageIndex);
                        if ((pageOrientation == 90) || (pageOrientation == 270))
                        {
                            content.AddTemplate(importedPage, 0, -1f, 1f, 0, 0,
                                reader.GetPageSizeWithRotation(currentPageIndex).Height);
                        }
                        else
                        {
                            content.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                throw new Exception("There has an unexpected exception" +
                        " occured during the pdf merging process.", exception);
            }
            finally
            {
                document.Close();
            }
            return output.GetBuffer();
        }
    }



    /// <summary>
    /// Implements custom page events.
    /// </summary>
    internal class PdfPageEvents : IPdfPageEvent
    {
        #region members
        private BaseFont _baseFont = null;
        private PdfContentByte _content;
        #endregion

        #region IPdfPageEvent Members
        public void OnOpenDocument(PdfWriter writer, Document document)
        {
            _baseFont = BaseFont.CreateFont(BaseFont.HELVETICA,
                                BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            _content = writer.DirectContent;
        }

        public void OnStartPage(PdfWriter writer, Document document)
        { }

        public void OnEndPage(PdfWriter writer, Document document)
        { }

        public void OnCloseDocument(PdfWriter writer, Document document)
        { }

        public void OnParagraph(PdfWriter writer,
                    Document document, float paragraphPosition)
        { }

        public void OnParagraphEnd(PdfWriter writer,
                    Document document, float paragraphPosition)
        { }

        public void OnChapter(PdfWriter writer, Document document,
                                float paragraphPosition, Paragraph title)
        { }

        public void OnChapterEnd(PdfWriter writer,
                    Document document, float paragraphPosition)
        { }

        public void OnSection(PdfWriter writer, Document document,
                    float paragraphPosition, int depth, Paragraph title)
        { }

        public void OnSectionEnd(PdfWriter writer,
                    Document document, float paragraphPosition)
        { }

        public void OnGenericTag(PdfWriter writer, Document document,
                                    Rectangle rect, string text)
        { }
        #endregion

        private float GetCenterTextPosition(string text, PdfWriter writer)
        {
            return writer.PageSize.Width / 2 - _baseFont.GetWidthPoint(text, 8) / 2;
        }
    }

我没有写这个,但做了一些修改。我不记得在哪里找到的。合并PDF后,我会调用此方法插入javascript,以便在打开PDF时打开打印对话框。如果将bSilent更改为true,则它应该以静默方式打印到其默认打印机。

public Stream addPrintJStoPDF(Stream thePDF)
{
    MemoryStream outPutStream = null;
    PRStream finalStream = null;
    PdfDictionary page = null;
    string content = null;

    //Open the stream with iTextSharp
    var reader = new PdfReader(thePDF);

    outPutStream = new MemoryStream(finalStream.GetBytes());
    var stamper = new PdfStamper(reader, (MemoryStream)outPutStream);
    var jsText = "var res = app.setTimeOut('this.print({bUI: true, bSilent: false, bShrinkToFit: false});', 200);";
    //Add the javascript to the PDF
    stamper.JavaScript = jsText;

    stamper.FormFlattening = true;
    stamper.Writer.CloseStream = false;
    stamper.Close();

    //Set the stream to the beginning
    outPutStream.Position = 0;

    return outPutStream;
}

我不确定上面的代码写得有多好,因为我从其他地方提取了它,而且我根本没有使用iTextSharp深入工作,但我知道它确实可以合并我在运行时生成的PDF。

欧阳飞章
2023-03-14

我使用iTextsharp和c#组合pdf文件。这是我使用的代码。

string[] lstFiles=new string[3];
    lstFiles[0]=@"C:/pdf/1.pdf";
    lstFiles[1]=@"C:/pdf/2.pdf";
    lstFiles[2]=@"C:/pdf/3.pdf";

    PdfReader reader = null;
    Document sourceDocument = null;
    PdfCopy pdfCopyProvider = null;
    PdfImportedPage importedPage;
    string outputPdfPath=@"C:/pdf/new.pdf";


    sourceDocument = new Document();
    pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create));

    //Open the output file
    sourceDocument.Open();

    try
    {
        //Loop through the files list
        for (int f = 0; f < lstFiles.Length-1; f++)
        {
            int pages =get_pageCcount(lstFiles[f]);

            reader = new PdfReader(lstFiles[f]);
            //Add pages of current file
            for (int i = 1; i <= pages; i++)
            {
                importedPage = pdfCopyProvider.GetImportedPage(reader, i);
                pdfCopyProvider.AddPage(importedPage);
            }

            reader.Close();
         }
        //At the end save the output file
        sourceDocument.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }


private int get_pageCcount(string file)
{
    using (StreamReader sr = new StreamReader(File.OpenRead(file)))
    {
        Regex regex = new Regex(@"/Type\s*/Page[^s]");
        MatchCollection matches = regex.Matches(sr.ReadToEnd());

        return matches.Count;
    }
}
农明辉
2023-03-14

如果要使用iText(Sharp)合并源文档,有两种基本情况:

>

  • 您确实希望合并文档,获取原始格式的页面,尽可能多地传输其内容和交互式注释。在这种情况下,您应该使用基于Pdf*Copy*类家族成员的解决方案。

    您实际上希望将源文档中的页面集成到一个新文档中,但是希望新文档控制通用格式,而不关心交互特性(注释...)在原始文档中(甚至想去掉)。在这种情况下,您应该使用基于< code>PdfWriter类的解决方案。

    您可以在iText的实际应用 ( 第二版) 的第 6 章(尤其是第 6.4 节)中找到详细信息。可以在此处访问 Java 示例代码,并在此处访问 C#'ed 版本。

    使用< code>PdfCopy的一个简单示例是Concatenate.java/concatenate . cs。核心代码是:

    byte[] mergedPdf = null;
    using (MemoryStream ms = new MemoryStream())
    {
        using (Document document = new Document())
        {
            using (PdfCopy copy = new PdfCopy(document, ms))
            {
                document.Open();
    
                for (int i = 0; i < pdf.Count; ++i)
                {
                    PdfReader reader = new PdfReader(pdf[i]);
                    // loop over the pages in that document
                    int n = reader.NumberOfPages;
                    for (int page = 0; page < n; )
                    {
                        copy.AddPage(copy.GetImportedPage(reader, ++page));
                    }
                }
            }
        }
        mergedPdf = ms.ToArray();
    }
    

    这里pdf可以定义为列表

    参考章节末尾的概述总结了提到的类的用法:

    >

  • 复制:从一个或多个现有 PDF 文档中复制页面。主要缺点:PdfCopy 无法检测到冗余内容,并且在连接表单时会失败。

    PdfCopyFields:将不同表单的字段放入一个表单中。可用于避免使用PdfCopy连接表单时遇到的表单字段问题。内存使用可能是一个问题。

    < code>PdfSmartCopy:从一个或多个现有PDF文档中复制页面。< code>PdfSmartCopy能够检测冗余内容,但它需要比< code>PdfCopy更多的内存和CPU。

    PdfWriter:从头开始生成PDF文档。可以从其他PDF文档导入页面。主要缺点是,导入页面的所有交互功能(注释、书签、字段等)都会在过程中丢失。

  •  类似资料:
    • 问题内容: 如何将多个PDF文件合并/转换为一个大PDF文件? 我尝试了以下操作,但是目标文件的内容不符合预期: 我需要一个非常简单/基本的命令行(CLI)解决方案。最好的办法是,如果我可以将合并/转换的输出直接传送到管道中(就像我之前在这里提出的问题中最初尝试的那样:Linux管道(convert->pdf2ps-> lp)。 问题答案: 抱歉,我设法使用Google自己找到了答案,还有些运气:

    • 我想合并几个pdf文件。我该怎么做? 到目前为止,我得到的是这个。 我正在尝试使用这个程序包myokyawhtun/PDFMerger。 根据我尝试合并的文件的不同,错误也会有所不同。 如果我尝试合并同一个pdf两次,则会生成该文件,但全部为空 如果我尝试上面的代码,就会得到HTTP错误500 如果我尝试使用更多文件,就会出现tcpdi_解析器内存不足错误 底线是它似乎不起作用。 我已经尝试了其他

    • 主要内容:合并多个PDF文档,示例在前一章中,我们已经看到如何将给定的PDF文档分成多个文档。 现在让我们学习如何将多个PDF文档合并为一个文档。 合并多个PDF文档 使用类的类将多个PDF文档合并到单个PDF文档中,该类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。 以下是合并多个PDF文档的步骤。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态

    • 在上一章中,我们已经了解了如何合并多个PDF文档。 在本章中,我们将了解如何从PDF文档的页面中提取图像。 从PDF文档生成图像 PDFBox库为您提供了一个名为PDFRenderer的类, PDFRenderer PDF文档呈现为AWT BufferedImage。 以下是从PDF文档生成图像的步骤。 第1步:加载现有PDF文档 使用PDDocument类的静态方法load()加载现有PDF文档

    • 在上一章中,我们已经了解了如何将给定的PDF文档拆分为多个文档。 现在让我们学习如何将多个PDF文档合并为一个文档。 合并多个PDF文档 您可以使用名为PDFMergerUtility类的类将多个PDF文档合并到一个PDF文档中,此类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。 以下是合并多个PDF文档的步骤。 第1步:加载现有PDF文档 使用PDDocument类的静态方法load

    • @cucumberoptions(features=“src/test/resources/features/xxxxx/xxxxx.feature”,标签=“@tag1”,胶={“com.xxxx.sfdc.opportunities.stepdefinities”},格式={“pretty”,“html:target/cucumber-reports/cucumber-pretty”,“jso