我目前有多个PDF文件。其中很少是由水晶报告生成的纵向和横向格式。这些涵盖约5至20 pdf,每页1或2页。其余的是来自多个不同公司的60到100 pdf,每个公司有1到10页。
1 - 合并所有这些PDF
2 - 强制所有页面上的人像或风景
合并PDF非常简单,将PdfCopy
与pdfWriter.GetImportedPage()
结合使用就可以了。所以目标#1已经完成。
我合并的文件有多个不同的布局时遇到问题。让我澄清一下。我有一个名为a.pdf
的文件,此文件有3页。第1页是纵向8.5x11,而第2页和第3页是横向17x11。如果我请求肖像,我需要该文件:
换句话说,第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;
}