以PDF格式插入PDF(不合并文件) [英] Insert PDF in PDF (NOT merging files)

查看:94
本文介绍了以PDF格式插入PDF(不合并文件)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在另一个缩放的PDF页面中插入PDF页面。我想使用iTextSharp。

I'd like to insert a PDF page in another PDF page scaled. I'd like to use iTextSharp for this.

我有一个矢量绘图,可以导出为单页PDF文件。我想将此文件添加到其他PDF文档的页面中,就像我将图像添加到PDF文档一样。

I have a vector drawing which can be exported as a single page PDF file. I would like to add this file into a page of other PDF document just like I would add an image to a PDF document.

这可能吗?

这样做的目的是保持放大的能力而不会降低质量。

The purpose of this is to retain the ability to zoom in without losing quality.

重现矢量绘图非常困难使用PDF向量,因为它是一个非常复杂的绘图。

It is very hard to reproduce the vector drawing using PDF vectors because it is an extremely complex drawing.

导出矢量绘图作为高分辨率图像不是一种选择,因为我必须在单个PDF文档中使用它们。最终的PDF文件非常大而且写得太慢。

Exporting the vector drawing as high resolution image is not an option since I have to use a lot of them in a single PDF document. The final PDF would be very large and its writing too slow.

推荐答案

虽然有几种方法,但相对容易做到去做吧。如果您正在创建一个包含其他文档的新文档,那么最简单的方法就是 PdfWriter.GetImportedPage(PdfReader,Int)。这将为您提供 PdfImportedPage (继承自 PdfTemplate )。完成后,您可以使用 PdfWriter.DirectContent.AddTemplate(PdfImportedPage,Matrix)将其添加到新文档中。

This is relatively easy to do although there's a couple of ways to go about it. If you're creating a new document that has the other documents inside of it and nothing else then the easiest thing to use is probably the PdfWriter.GetImportedPage(PdfReader, Int). This will give you a PdfImportedPage (which inherits from PdfTemplate). Once you have that you can add it to your new document by using PdfWriter.DirectContent.AddTemplate(PdfImportedPage, Matrix).

AddTemplate()有几个重载,但最简单的(至少对我来说)是一个 System.Drawing .Drawing2D.Matrix 。如果你使用它,你可以轻松地缩放和翻译(改变x,y),而不必考虑矩阵术语。

There's a couple of overloads to AddTemplate() but the easiest one (at least for me) is the one that takes a System.Drawing.Drawing2D.Matrix. If you use this you can easily scale and translate (change x,y) without having to think in "matrix" terms.

下面是示例代码,显示了这一点。它针对iTextSharp 5.4.0虽然如果使用语句删除,它应该与4.1.6完全相同。它首先创建一个包含12页随机背景颜色的PDF示例。然后,它会创建第二个文档,并将第一个PDF中的每个页面按50%缩放,以便4个旧页面适合1个新页面。有关详细信息,请参阅代码注释。此代码假定所有页面大小相同,如果情况不同,您可能需要执行进一步的计算。

Below is sample code that shows this off. It targets iTextSharp 5.4.0 although it should work pretty much the same with 4.1.6 if you remove the using statements. It first creates a sample PDF with 12 pages with random background colors. Then it creates a second document and adds each page from the first PDF scaled by 50% so that 4 old pages fit onto 1 new page. See the code comments for further details. This code assumes that all pages are the same size, you might need to perform further calculations if your situation differs.

//Test files that we'll be creating
var file1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File1.pdf");
var file2 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File2.pdf");

//For test purposes we'll fill the pages with a random background color
var R = new Random();

//Standard PDF creation, nothing special here
using (var fs = new FileStream(file1, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (var doc = new Document()) {
        using (var writer = PdfWriter.GetInstance(doc, fs)) {
            doc.Open();

            //Create 12 pages with text on each one
            for (int i = 1; i <= 12; i++) {
                doc.NewPage();

                //For test purposes fill the page with a random background color
                var cb = writer.DirectContentUnder;
                cb.SaveState();
                cb.SetColorFill(new BaseColor(R.Next(0, 256), R.Next(0, 256), R.Next(0, 256)));
                cb.Rectangle(0, 0, doc.PageSize.Width, doc.PageSize.Height);
                cb.Fill();
                cb.RestoreState();

                //Add some text to the page
                doc.Add(new Paragraph("This is page " + i.ToString()));
            }
            doc.Close();
        }
    }
}

//Create our combined file
using (var fs = new FileStream(file2, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (var doc = new Document()) {
        using (var writer = PdfWriter.GetInstance(doc, fs)) {

            //Bind a reader to the file that we created above
            using (var reader = new PdfReader(file1)) {
                doc.Open();

                //Get the number of pages in the original file
                int pageCount = reader.NumberOfPages;

                //Loop through each page
                for (int i = 0; i < pageCount; i++) {
                    //We're putting four original pages on one new page so add a new page every four pages
                    if (i % 4 == 0) {
                        doc.NewPage();
                    }

                    //Get a page from the reader (remember that PdfReader pages are one-based)
                    var imp = writer.GetImportedPage(reader, (i + 1));
                    //A transform matrix is an easier way of dealing with changing dimension and coordinates on an rectangle
                    var tm = new System.Drawing.Drawing2D.Matrix();

                    //Scale the image by half
                    tm.Scale(0.5f, 0.5f);

                    //PDF coordinates put 0,0 in the bottom left corner.
                    if (i % 4 == 0) {
                        tm.Translate(0, doc.PageSize.Height);                   //The first item on the page needs to be moved up "one square"
                    } else if (i % 4 == 1) {
                        tm.Translate(doc.PageSize.Width, doc.PageSize.Height);  //The second needs to be moved up and over
                    } else if (i % 4 == 2) {
                                                                                //Nothing needs to be done for the third
                    } else if (i % 4 == 3) {
                        tm.Translate(doc.PageSize.Width, 0);                    //The fourth needs to be moved over
                    }

                    //Add our imported page using the matrix that we set above
                    writer.DirectContent.AddTemplate(imp,tm);

                }

                doc.Close();
            }
        }
    }
}

这篇关于以PDF格式插入PDF(不合并文件)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆