10

我有几个产品数据表。每个都是一个单独的文件。我想要做的是使用 iText 根据对 web 表单的答案生成摘要/推荐的一组操作,然后附加到所有相关的数据表。这样,我只需要在浏览器中打开一个新选项卡即可打印所有信息,而不是为摘要打开一个选项卡,为所需的每个数据表打开一个选项卡。

那么,是否可以使用 iText 做到这一点?

4

5 回答 5

21

是的,您可以使用 iText 7 合并 PDF。例如,查看iText 7 Jump-Start 教程示例C06E04_88th_Oscar_Combine,关键代码是:

PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PdfMerger merger = new PdfMerger(pdf);

//Add pages from the first document
PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(SRC1));
merger.merge(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages());

//Add pages from the second pdf document
PdfDocument secondSourcePdf = new PdfDocument(new PdfReader(SRC2));
merger.merge(secondSourcePdf, 1, secondSourcePdf.getNumberOfPages());

firstSourcePdf.close();
secondSourcePdf.close();
pdf.close();

C06E​​04_88th_Oscar_Combine方法createPdf


根据您的用例,您可能希望使用PdfDenseMerger及其辅助类PageVerticalAnalyzer而不是PdfMerger此处。它试图将来自多个源页面的内容放到一个目标页面上,并对应于这个答案中的 iText 5 PdfVeryDenseMergeTool。由于 PDF 文件的性质,这仅适用于没有页眉、页脚和类似工件的 PDF。

于 2016-11-14T17:02:00.890 回答
2

如果要添加两个字节数组并以 PDF/A 格式返回一个字节数组

public static byte[] mergePDF(byte [] first, byte [] second) throws IOException {
    // Initialize PDF writer
    ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
    PdfWriter writer = new PdfWriter(arrayOutputStream);
    

    // Initialize PDF document
    PdfADocument pdf = new PdfADocument(writer, PdfAConformanceLevel.PDF_A_1B, new PdfOutputIntent("Custom", "",
            "https://www.color.org", "sRGB IEC61966-2.1", new FileInputStream("sRGB_CS_profile.icm")));


    PdfMerger merger = new PdfMerger(pdf);

    //Add pages from the first document
    PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(new ByteArrayInputStream(first)));
    merger.merge(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages());

    //Add pages from the second pdf document
    PdfDocument secondSourcePdf = new PdfDocument(new PdfReader(new ByteArrayInputStream(second)));
    merger.merge(secondSourcePdf, 1, secondSourcePdf.getNumberOfPages());
    
    firstSourcePdf.close();
    secondSourcePdf.close();
    writer.close();
    pdf.close();


    return arrayOutputStream.toByteArray();
}
于 2020-07-30T18:34:57.430 回答
2

该问题未指定语言,因此我使用 C# 添加答案;这对我有用。我正在创建三个独立但相关的 PDF,然后将它们合并为一个。

在创建三个单独的 PDF 文档并向它们添加数据后,我将它们组合在一起:

PdfDocument pdfCombined = new PdfDocument(new PdfWriter(destCombined));
PdfMerger merger = new PdfMerger(pdfCombined);

PdfDocument pdfReaderExecSumm = new PdfDocument(new PdfReader(destExecSumm));
merger.Merge(pdfReaderExecSumm, 1, pdfReaderExecSumm.GetNumberOfPages());

PdfDocument pdfReaderPhrases = new PdfDocument(new PdfReader(destPhrases));
merger.Merge(pdfReaderPhrases, 1, pdfReaderPhrases.GetNumberOfPages());

PdfDocument pdfReaderUncommonWords = new PdfDocument(new PdfReader(destUncommonWords));
merger.Merge(pdfReaderUncommonWords, 1, pdfReaderUncommonWords.GetNumberOfPages());

pdfCombined.Close();

因此,合并后的 PDF 是 PDFWriter 类型的 PdfDocument,合并后的部分是 PdfReader 类型的 PdfDocument,而 PdfMerger 是将它们粘合在一起的粘合剂。

于 2020-06-28T00:47:56.360 回答
1

我找到了一个效果很好的解决方案。

public byte[] Combine(IEnumerable<byte[]> pdfs)
{
    using (var writerMemoryStream = new MemoryStream())
    {
        using (var writer = new PdfWriter(writerMemoryStream))
        {
            using (var mergedDocument = new PdfDocument(writer))
            {
                var merger = new PdfMerger(mergedDocument);

                foreach (var pdfBytes in pdfs)
                {
                    using (var copyFromMemoryStream = new MemoryStream(pdfBytes))
                    {
                        using (var reader = new PdfReader(copyFromMemoryStream))
                        {
                            using (var copyFromDocument = new PdfDocument(reader))
                            {
                                merger.Merge(copyFromDocument, 1, copyFromDocument.GetNumberOfPages());
                            }
                        }
                    }
                }
            }
        }

        return writerMemoryStream.ToArray();
    }
}

利用

DirectoryInfo d = new DirectoryInfo(INPUT_FOLDER);
            
var pdfList = new List<byte[]> { };

foreach (var file in d.GetFiles("*.pdf"))
{
    pdfList.Add(File.ReadAllBytes(file.FullName));
}


File.WriteAllBytes(OUTPUT_FOLDER + "\\merged.pdf", Combine(pdfList));

作者: https ://www.nikouusitalo.com/blog/combining-pdf-documents-using-itext7-and-c/

于 2021-10-30T04:20:27.613 回答
0

这是将 file1.pdf 合并到 file2.pdf 创建新的 merge.pdf 所需的最少 C# 代码:

var path = @"C:\Temp\";

var src0 = System.IO.Path.Combine(path, "merged.pdf");
var wtr0 = new PdfWriter(src0);
var pdf0 = new PdfDocument(wtr0);

var src1 = System.IO.Path.Combine(path,  "file1.pdf");
var fi1 = new FileInfo(src1);
var rdr1= new PdfReader(fi1);
var pdf1 = new PdfDocument(rdr1);

var src2 = System.IO.Path.Combine(path,  "file2.pdf");
var fi2 = new FileInfo(src2);
var rdr2 = new PdfReader(fi2);
var pdf2 = new PdfDocument(rdr2);

var merger = new PdfMerger(pdf0);

merger.Merge(pdf1, 1, pdf1.GetNumberOfPages());
merger.Merge(pdf2, 1, pdf2.GetNumberOfPages());

merger.Close();
pdf0.Close();
于 2021-07-23T17:02:51.410 回答