我一直在努力解决这个问题!我需要将各种PDF文件合并到一个文件中,因为合并后需要图形使用,我需要保留原始文件中的trimbox。
问题是我的新PDF文件的第一页没有从原始文件获得所请求的修剪盒大小,但其余部分是......?
我正在使用C#和itextsharp,我的代码看起来像这样(只使用一个文件,以避免任何其他错误):
PdfReader pdfFile = new PdfReader("C:\\temp\\test.pdf");
int noOfPages = pdfFile.NumberOfPages;
// Create document with same page size as original
Document document = new Document(pdfFile.GetPageSizeWithRotation(1));
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("C:\\temp\\out\\test.pdf", FileMode.Create));
document.Open();
PdfContentByte cb = writer.DirectContent;
for (int i = 1; i < noOfPages+1; i++)
{
//Read trimbox from PDF file
var masterPage = pdfFile.GetPageN(i);
var masterPageTrimBox = (PdfArray)masterPage.Get(PdfName.TRIMBOX);
float lowerLeftX = ((PdfNumber)masterPageTrimBox[0]).FloatValue;
float lowerLeftY = ((PdfNumber)masterPageTrimBox[1]).FloatValue;
float upperRightX = ((PdfNumber)masterPageTrimBox[2]).FloatValue;
float upperRightY = ((PdfNumber)masterPageTrimBox[3]).FloatValue;
float newPageSizeX = (upperRightX - lowerLeftX) + 17;
float newPageSizeY = (upperRightY - lowerLeftY) + 17;
cb.PdfWriter.SetBoxSize("trim", new iTextSharp.text.Rectangle(lowerLeftX, lowerLeftY, upperRightX, upperRightY));
PdfImportedPage page;
int rotation;
page = writer.GetImportedPage(pdfFile, i);
document.NewPage();
rotation = pdfFile.GetPageRotation(i);
if (rotation == 90 || rotation == 270)
{
cb.AddTemplate(page, 0, -1f, 1f, 0, 0, pdfFile.GetPageSizeWithRotation(i).Height);
}
else
{
cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
}
}
document.Close();
我尝试在循环之前创建一个页面,但随后它开始从第3页开始设置正确的trimbox值,如果我在document.NewPage之后移动SetBoxSize,我仍然会从第2页获得trimbox值,但是我有上一页的修剪框!
任何帮助或暗示都将受到高度赞赏:)
PS:我已经做了一个真的脏测试/解决方法,读取trixbox值并在循环中添加一个页面,然后循环得到它正确,但给我一个新的PDF包含1页太多的文件(当然,它仍然有一个不正确的修剪框),但是itextsharp无法删除页面。我搜索的建议只是建议创建一个新的PDF,从头开始阅读所有内容并将其放入一个新文件,这当然咬了它自己的尾巴!我可以使用除了itextsharp之外的其他东西来删除第1页,但是我真的希望这可以像以下那样工作:)答案 0 :(得分:0)
每当触发NewPage()
时(显式或隐式),页面都会被初始化,页面边界将成为最终页面。如果你可以改变页面边界,在添加内容的过程中会出现奇怪的副作用。
NewPage()
。在这种情况下,会自动创建一个新页面。
NewPage()
时, document.Open()
也会在一开始就被触发。该方法定义并锁定第一页的页面边界,包括TrimBox。
如果要为第一页定义TrimBox,则需要在 document.Open()
之前将其设置为。如果您在 document.NewPage()
之后更改页面边界,则只有在下一个 document.NewPage()
之后才会生效。