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

使用ITextSharp(旧版本)将多个文件合并为pdf

范兴文
2023-03-14

首先,抱歉的低努力的问题…我曾用这些问题作为参考:

using iText.IO.Image;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using System.Collections.Generic;
using System.IO;

namespace Example
{
    public class ITextPdfCreator : IPdfCreator
    {
        public MemoryStream Create(IEnumerable<(string ContentType, byte[] Content)> blobs)
        {
            using (var memoryStream = new MemoryStream())
            {
                using (var writer = new PdfWriter(memoryStream))
                {
                    var pdf = new PdfDocument(writer);
                    var document = new Document(pdf);
                    var firstIteration = true;

                    foreach (var blob in blobs)
                    {
                        if (!firstIteration)
                        {
                            document.Add(new AreaBreak(iText.Layout.Properties.AreaBreakType.NEXT_PAGE));
                        }

                        if (blob.ContentType.StartsWith("image/"))
                        {
                            var content = new Image(ImageDataFactory.Create(blob.Content));
                            document.Add(content);
                        }
                        else if (blob.ContentType.StartsWith("application/pdf"))
                        {
                            Stream stream = new MemoryStream(blob.Content);
                            var d = new PdfDocument(new PdfReader(stream));
                            d.CopyPagesTo(1, d.GetNumberOfPages(), pdf, pdf.GetNumberOfPages() + 1);
                        }

                        firstIteration = false;
                    }
                    document.Close();
                }

                return memoryStream;
            }
        }
    }
}

如果有人有任何线索,那就太神奇了!如果不是,请随意为我的一个低努力的问题生气…当我自己弄清楚的时候,我会发布一个更新!

共有1个答案

锺离明煦
2023-03-14

我找到解决办法了!

我的代码如下:

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;

public class ITextSharpPdfMerger
{
    private const float _imageLeftMargin = 10f;
    private const float _imageRightMargin = 10f;
    private const float _imageBottomMargin = 30f;
    private const float _imageTopMargin = 30f;

    // https://github.com/VahidN/iTextSharp.LGPLv2.Core
    // https://stackoverflow.com/a/6056801/3013479
    public byte[] Create(IEnumerable<(string ContentType, byte[] Content)> blobs)
    {
        Document document = null;
        PdfCopy copy = null;

        using (var stream = new MemoryStream())
        {

            try
            {
                document = new Document();
                copy = new PdfCopy(document, stream);

                document.Open();

                foreach (var blob in blobs)
                {
                    if (blob.ContentType.StartsWith("image/"))
                    {
                        AddImage(copy, blob.Content);
                    }
                    else if (blob.ContentType == "application/pdf")
                    {
                        AddPdf(copy, blob.Content);
                    }
                    else
                    {
                        throw new ArgumentException($"Blob with ContentType {blob.ContentType} is not supported for merging.");
                    }
                }
            }
            finally
            {
                document?.Close();
                copy?.Close();
            }

            return stream.ToArray();
        }
    }

    private static void AddPdf(PdfCopy copy, byte[] content)
    {
        PdfReader reader = null;
        try
        {
            reader = new PdfReader(content);

            // Grab each page from the PDF and copy it
            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                var page = copy.GetImportedPage(reader, i);
                copy.AddPage(page);
            }

            // A PDF can have a form; we copy it into the resulting pdf.
            // Example: https://web.archive.org/web/20210322125650/https://www.windjack.com/PDFSamples/ListPrograming_Part1_AcroForm.pdf 
            var form = reader.AcroForm;
            if (form != null)
            {
                copy.CopyAcroForm(reader);
            }

        }
        finally
        {
            reader?.Close();
        }
    }

    private static void AddImage(PdfCopy copy, byte[] content)
    {
        // We have a little workaround to add images because we use PdfCopy which is only useful for COPYING and doesn't work for adding pages manually.
        // So we create a new PDF in memory containing the image, and then we copy that PDF into the resulting PDF.
        // https://stackoverflow.com/a/26111677/3013479
        Document document = null;
        PdfWriter writer = null;
        PdfReader reader = null;
        using (var stream = new MemoryStream())
        {
            try
            {
                document = new Document();
                writer = PdfWriter.GetInstance(document, stream);

                document.Open();
                if (!document.NewPage())
                {
                    throw new Exception("New page could not be created");
                }

                var image = Image.GetInstance(content);

                // Make the image fit on the page
                // https://stackoverflow.com/q/4932187/3013479
                image.Alignment = Element.ALIGN_MIDDLE;
                var pageWidth = copy.PageSize.Width - (_imageLeftMargin + _imageRightMargin);
                var pageHeight = copy.PageSize.Height - (_imageBottomMargin + _imageTopMargin);
                image.ScaleToFit(pageWidth, pageHeight);

                if (!document.Add(image))
                {
                    throw new Exception("Unable to add image to page");
                }

                // These are required for the PdfReader instantation to succeed
                document.Close();
                writer.Close();

                reader = new PdfReader(stream.ToArray());

                copy.AddPage(copy.GetImportedPage(reader, 1));
            }
            finally
            {
                document?.Close();
                reader?.Close();
                writer?.Close();
            }
        }
    }
 类似资料:
  • 问题内容: 假设我们有许多文本文件,如下所示: 文件1: 文件2: 文件3: 文件4: 我们如何制作一个文本文件,如下所示: 结果: 相关代码可能是: 在这之后?有什么帮助吗? 问题答案: 您可以将每个文件的内容直接读取到输出文件句柄的write方法中,如下所示:

  • 本文向大家介绍Python将多个excel文件合并为一个文件,包括了Python将多个excel文件合并为一个文件的使用技巧和注意事项,需要的朋友参考一下 利用Python,将多个excel文件合并为一个文件 思路 利用python xlrd包读取excle文件,然后将文件内容存入一个列表中,再利用xlsxwriter将内容写入到一个新的excel文件中。 完整代码 源文件excel1: 源文件e

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

  • 我需要将N个PDF文件合并成一个。我先创建一个空白文件 稍后,我将遍历html字符串数组 我不太明白PdfWriter和PDFCopy之间的区别。

  • 我有一个商业案例,使用Spring batch将多个csv文件(每个文件大约1000个,包含1000条记录)合并成单个csv。 请帮助我提供方法和性能方面的指导和解决方案。 到目前为止,我已经尝试了两种方法, 方法1。 Tasklet chunk与multiResourceItemReader一起从目录中读取文件,FlatFileItemWriter作为项目编写器。 这里的问题是,它的处理速度非常

  • 问题内容: 如何使用Java合并两个WAV文件? 我试过了,但是没有正常工作,他们还有其他方法吗? 问题答案: 如果直接使用wav文件的字节,则可以在任何编程语言中使用相同的策略。对于此示例,我将假设两个源文件具有相同的比特率/数字通道,并且具有相同的长度/大小。(否则,您可能可以在开始合并之前对其进行编辑)。 首先看一下WAV规范,我在斯坦福课程网站上找到了一个很好的人: 常见的标头长度为44或