合并和旋转具有不同页面格式和大小的文档

时间:2016-08-24 14:46:34

标签: c# itext

上下文:

我目前有多个PDF文件。其中很少是由水晶报告生成的纵向和横向格式。这些涵盖约5至20 pdf,每页1或2页。其余的是来自多个不同公司的60到100 pdf,每个公司有1到10页。

目标:

1 - 合并所有这些PDF

2 - 强制所有页面上的人像或风景

我取得的成就:

合并PDF非常简单,将PdfCopypdfWriter.GetImportedPage()结合使用就可以了。所以目标#1已经完成。

问题:

我合并的文件有多个不同的布局时遇到问题。让我澄清一下。我有一个名为a.pdf的文件,此文件有3页。第1页是纵向8.5x11,而第2页和第3页是横向17x11。如果我请求肖像,我需要该文件:

  • 第1页肖像8.5x11
  • 第2页肖像11x17
  • 第3页肖像11x17

换句话说,第2页和第3页需要轮换,出于设计原因,我们需要90度逆时针。

合并具有不同页面格式的文件时,我的合并代码现在生成文件,但文件为0kb。因此,不同的格式无法正常生成。

所以我做了我的旋转方法但是这又导致0kb文件。旋转和itextsharp的问题我只发现我可以使用Document对象,整个文档只有一个页面大小属性而不是每页,我相信这是我的问题。

我一直致力于在线查找过去5小时的解决方案,但所有解决方案仍使用Document对象,并将页面大小设置为PDF文档第一页的大小。

我可能会遗漏一些东西,我在2年内没有与itextsharp合作,所以我很生气。

代码:

这是我合并的pdf方法:

public static bool MergeFiles(List<string> filePathToMerge, string filePathToOutput)
{
    var success = false;

    try
    {
        var validFiles = filePathToMerge.Where(f => File.Exists(f)).ToList();

        if (validFiles.Count > 0)
        {
            // merge the files with pdf
            var pdfDocument = new iTextSharp.text.Document();
            var pdfWriter = new iTextSharp.text.pdf.PdfCopy(pdfDocument, new FileStream(filePathToOutput, FileMode.Create));
            pdfDocument.Open();

            validFiles.ForEach(f =>
            {
                var pdfReader = new iTextSharp.text.pdf.PdfReader(f);
                pdfReader.ConsolidateNamedDestinations();

                for (int pageNo = 1; pageNo <= pdfReader.NumberOfPages; pageNo++)
                {
                    var pageImported = pdfWriter.GetImportedPage(pdfReader, pageNo);
                    pdfWriter.AddPage(pageImported);
                }

                pdfReader.Close();
            });

            pdfWriter.Close();
            pdfDocument.Close();

            success = true;
        }
    }
    catch { }

    return success;
}

这是我的轮换方法

public static bool ChangeOrientation(string filePath, string filePathOutput, bool portrait)
{
    var success = false;

    try
    {
        // check if we will replace the file
        var replaceFile = filePath == filePathOutput;

        // make sure the file exists
        if (File.Exists(filePath))
        {
            // teh pdf reader
            PdfReader reader = new PdfReader(filePath);

            // an empty document
            var document = new Document();

            // the pdf writer
            var writer = PdfWriter.GetInstance(document, new FileStream(filePathOutput + (replaceFile ? "2" : ""), FileMode.Create));

            // open the document
            document.Open();

            // get content byte
            var cb = writer.DirectContent;

            // get page quantity
            var pageCount = reader.NumberOfPages;

            // for each page we will check if rotation required otherwise we simply copy the page to the new document
            for (int i = 0; i < pageCount; i++)
            {
                // create new page with size
                document.SetPageSize(reader.GetPageSizeWithRotation(i));
                document.NewPage();

                // get page dimensions
                var pageSize = reader.GetPageSize(i);

                // check if rotation is required
                var isRotationRequired = (pageSize.Width > pageSize.Height && portrait) || (pageSize.Width < pageSize.Height && !portrait);

                // get the page imported
                var importedPage = writer.GetImportedPage(reader, i);

                // if rotation required apply i to the imported page
                if (isRotationRequired)
                {
                    // if rotation required an we request portrait, it means the page is landscape once it reach this part of code.
                    // we then want the landscape page to rotate 90 degree counter clockwise so the bottom of the page is on the right.
                    // If we want lanscape and the page is portrait and we want want the bottom of the page to be on the right so we also
                    // want a 90 degree counter clockwise rotation

                    // here i take the current rotation minus our arbitrary 90 degree we wanted, like so if it has
                    // any rotations already i dont care what it is since i already know from the dimensions it's not properly rotated
                    // all page i will feed to this method will only contain right angle rotations
                    var rotation = reader.GetPageRotation(i) - 90;

                    // add rotated page
                    cb.AddTemplate(importedPage, 0, -1f, 1f, 0, reader.GetPageSizeWithRotation(i).Width, 0);

                }
                else
                {
                    cb.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);
                }                        
            }

            // close the reader
            reader.Close();

            // close writer
            writer.Close();

            // close document
            document.Close();

            if (replaceFile)
            {
                // delete old file
                File.Delete(filePath);

                // rename the file
                File.Move(filePath + "2", filePath);
            }

            success = true;
         }
    }
    catch { }

    return success;
}

0 个答案:

没有答案