使用itext 7将多个页面的内容合并为一个页面

时间:2018-02-02 19:14:25

标签: c# .net itext

我有一份pdf保险文件,现在每个条款都在一个单独的页面上。我希望获得具有短子句的页面,并将它们与其他页面组合成一个页面。

这里我传递的文件代表2页。我试图了解如何使用一些测试代码执行此操作的机制。

我想将这两个页面读入一个新的目标页面并返回该页面。

我不想更改原始内容的比例,但如果我不使用ConcatMatrix进行转换,则根本不会显示任何内容。

在这里,我可以在一个页面中看到两个页面的内容,但它们太小了。我只是将参数调用到AddXObject中。参数采用a,b,c,d等,你怎么知道哪些是x,y,高度,宽度..?

public byte[] ManipulatePdf(byte[] file)
    {
        byte[] result;

        using (var ms = new MemoryStream())
        {
            PdfDocument pdf = new PdfDocument(new PdfWriter(ms));
            PdfDocument sourcePdf = new PdfDocument(new PdfReader(new MemoryStream(file)));                
            var pages = sourcePdf.GetNumberOfPages();                
            PageSize nUpPageSize = PageSize.A4;
            PdfPage targetPage = pdf.AddNewPage(nUpPageSize);
            PdfCanvas canvas = new PdfCanvas(targetPage);                

            //if we remove ConcatMatrix we get nothing
            //otherwise it appears too small
            for (int i = 1; i <= pages; i++)
            {
                PdfPage currentPage = sourcePdf.GetPage(i);
                Rectangle orig = targetPage.GetPageSize();
                var width = nUpPageSize.GetWidth() / orig.GetWidth() / 2f;
                var height = nUpPageSize.GetHeight() / orig.GetHeight() / 2f;
                AffineTransform transformationMatrix = AffineTransform.GetScaleInstance(
                width, height);
                canvas.ConcatMatrix(transformationMatrix);

                var height1 = orig.GetHeight();
                var width2 = orig.GetWidth() / 2;
                var height2 = orig.GetHeight() / 2;

                PdfFormXObject pageCopy = currentPage.CopyAsFormXObject(pdf);
                if (i == 1)
                    canvas.AddXObject(pageCopy, 0, height1);                    
                else
                    canvas.AddXObject(pageCopy,0, 1200);

            }                
            // close the documents
            pdf.Close();
            sourcePdf.Close();
            canvas.Release();
            result = ms.GetBuffer();
        }


        return result;
    }

1 个答案:

答案 0 :(得分:0)

这是我的解决方案,我不想缩小它,所以我使用0.99保持原始大小,如果我使用1然后它根本不显示。

第二页的y位置使用负值..如果我使用+400然后它从页面上消失,0它覆盖了第一页内容,但减去它继续向下移动。 :)

 //if we remove ConcatMatrix we get nothing
            //otherwise it appears to small
            //setting transformation to 1 shows nothing
            for (int i = 1; i <= pages; i++)
            {
                PdfPage currentPage = sourcePdf.GetPage(i);
                Rectangle orig = targetPage.GetPageSize();
                var width = 0.99f;//= nUpPageSize.GetWidth() / orig.GetWidth() / 2f;
                var height = 0.99f;//nUpPageSize.GetHeight() / orig.GetHeight() / 2f;
                AffineTransform transformationMatrix = AffineTransform.GetScaleInstance(
                width, height);
                canvas.ConcatMatrix(transformationMatrix);

                var height1 = orig.GetHeight();
                var width2 = orig.GetWidth() / 2;
                var height2 = orig.GetHeight() / 2;

                PdfFormXObject pageCopy = currentPage.CopyAsFormXObject(pdf);
                if (i == 1)                                         
                    canvas.AddXObject(pageCopy, 0, 0); 
                else                      
                    canvas.AddXObject(pageCopy, 0, -400);

            }