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

将使用ITextSharp从html创建的N个pdf文件合并到另一个空白pdf文件

刘永望
2023-03-14

我需要将N个PDF文件合并成一个。我先创建一个空白文件

byte[] pdfBytes = null;

var ms = new MemoryStream();
var doc = new iTextSharp.text.Document();
var cWriter = new PdfCopy(doc, ms);

稍后,我将遍历html字符串数组

foreach (NBElement htmlString in someElement.Children())
                    {
                        byte[] msTempDoc = getPdfDocFrom(htmlString.GetString(), cssString.GetString());
                        addPagesToPdf(cWriter, msTempDoc);
                    }
private byte[] getPdfDocFrom(string htmlString, string cssString)
    {
        var tempMs = new MemoryStream();
        byte[] tempMsBytes;
        var tempDoc = new iTextSharp.text.Document();
        var tempWriter = PdfWriter.GetInstance(tempDoc, tempMs);
        tempDoc.Open();

        using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssString)))
        {
            using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(htmlString)))
            {
                //Parse the HTML
                iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(tempWriter, tempDoc, msHtml, msCss);
                tempMsBytes = tempMs.ToArray();
            }
        }

        tempDoc.Close();
        return tempMsBytes;
    }
private static void addPagesToPdf(PdfCopy mainDocWriter,  byte[] sourceDocBytes)
    {

        using (var msOut = new MemoryStream())
        {
            PdfReader reader = new PdfReader(new MemoryStream(sourceDocBytes));
            int n = reader.NumberOfPages;
            PdfImportedPage page;
            for (int i = 1; i <= n; i++)
            {
                page = mainDocWriter.GetImportedPage(reader, i);
                mainDocWriter.AddPage(page);
            }
        }}

我不太明白PdfWriter和PDFCopy之间的区别。

共有1个答案

东明德
2023-03-14

您的代码中有一个逻辑错误。当您像在getpdfdocfrom()方法中那样从头开始创建文档时,直到您触发了close()方法,文档才会完整。在这个close()方法中,将创建一个拖尾和一个交叉引用(xref)表。错误会告诉您这些都丢失了。

实际上,您确实调用了close()方法:

tempDoc.Close();

但是当您close()文档时,已经太晚了:您已经创建了tempmsbytes数组。您需要在关闭文档后创建该数组。

备注:通过将pdfimportedPage实例添加到pdfwriter来合并文件是一个糟糕的例子。如果您使用的是iTextSharp5或更早版本,则应该使用pdfcopypdfsmartcopy来执行此操作。如果使用pdfwriter,则会丢弃大量信息(例如链接注释)。

 类似资料:
  • 首先,抱歉的低努力的问题…我曾用这些问题作为参考: 如果有人有任何线索,那就太神奇了!如果不是,请随意为我的一个低努力的问题生气…当我自己弄清楚的时候,我会发布一个更新!

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

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

  • 如果我有一些文件,每个文件都有一个页面,我想使用 我在这里读到了几十个关于相同的问题,但大多数问题都已经过时或不再适用于

  • 在java Web应用程序中使用PDFBox。我有一个代表多页绘图或蓝图的PDF文件。还有其他PDF文件表示对父文件的修改。我想将这些页面插入到第1页和第2页之间的父PDF文件中。 我找到了关于合并和添加页面的文章,但不完全是我需要的。 一些指导会很有帮助。 到目前为止我的代码:

  • 我正在使用Apache PdfBox来预设几个非PDF/A表单,并使用将这些PDF合并在一起,并创建新PDF的字节数组。 是否有一种方法可以告诉创建一个不能再修改的有效PDF/A文档?