C# itextsharp设置trimbox在我的文档的第一页不起作用

C# itextsharp设置trimbox在我的文档的第一页不起作用,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我已经为此挣扎了很长一段时间了!我需要将各种PDF文件合并到一个文件中,由于合并后需要使用图形,因此我需要从原始文件中维护trimbox 问题是,我的新PDF文件的第一页并没有从原始文件中获得所需的trimbox大小,但其余的页面会 我使用的是C#和itextsharp,我的代码如下所示(仅使用一个文件,以排除任何其他错误): PdfReader pdfFile=newpdfreader(“C:\\temp\\test.pdf”); int noOfPages=pdfFile.NumberOfP

我已经为此挣扎了很长一段时间了!我需要将各种PDF文件合并到一个文件中,由于合并后需要使用图形,因此我需要从原始文件中维护trimbox

问题是,我的新PDF文件的第一页并没有从原始文件中获得所需的trimbox大小,但其余的页面会

我使用的是C#和itextsharp,我的代码如下所示(仅使用一个文件,以排除任何其他错误):

PdfReader pdfFile=newpdfreader(“C:\\temp\\test.pdf”);
int noOfPages=pdfFile.NumberOfPages;
//创建与原始文档页面大小相同的文档
Document Document=新文档(pdfFile.GetPageSizeWithRotation(1));
PdfWriter writer=PdfWriter.GetInstance(文档,新文件流(“C:\\temp\\out\\test.pdf”,FileMode.Create));
document.Open();
PdfContentByte cb=writer.DirectContent;
对于(int i=1;i
我尝试在循环之前创建一个页面,但是它从第3页开始设置正确的trimbox值,并且如果我在document.NewPage之后移动SetBoxSize,我仍然从第2页获得trimbox值,但是我从上一页获得了trimbox

如有任何帮助或提示,将不胜感激:)

PS:我已经做了一个非常糟糕的测试/解决方法,读取trixbox值并添加一个类似于循环中的页面,然后循环得到正确的结果,但留下一个新的PDF文件,其中包含的页面太多(当然仍然有一个不正确的trimbox),但itextsharp无法删除页面。我搜索的建议只是建议创建一个新的PDF,从头开始阅读所有内容并将其放入一个新文件中,这当然会咬到它自己的尾巴!我可以使用itextsharp以外的其他工具来删除第1页,但我真的希望它能够像预期的那样工作:)

每当触发
NewPage()
时(无论是显式还是隐式),页面都会被初始化,并且其页面边界成为最终边界。如果您可以在添加内容的过程中更改页面边界,就会出现奇怪的副作用

NewPage()
将在您添加不再适合页面的内容时隐式触发。在这种情况下,将自动创建一个新页面

调用
document.Open()
时,
NewPage()
也会在最开始时触发。该方法定义并锁定第一页的页面边界,包括TrimBox


如果要为第一页定义TrimBox,需要在
document.Open()
之前设置它。如果在
document.NewPage()
之后更改页面边界,它只会在下一个
document.NewPage()

之后生效。对于您的任务,您是否最好使用
PdfStamper
PdfCopy
而不是
PdfWriter
?我只是在编辑一个已经运行的解决方案,最初做这个项目的人使用的是
PdfWriter
,但也许是时候买Bruno的书了。iText in Action要真的隐藏起来,想想PDF文件已经存在了:)还可以查看他开始出版的所有免费书籍……你能提供这些书籍的链接吗?它们都列在页面上。谢谢,Bruno!我试图在
document.Open()
之前设置trimbox,但这只是在运行时出现了一个错误,说“文档未打开”-你能提示一下如何在打开之前设置trimbox吗?在谷歌搜索SetBoxSize多一点后,我找到了它,并发现将
writer.SetBoxSize(“trim”,new iTextSharp.text.Rectangle)放入(50,50500700));
在开始之前,像假定的那样工作,谢谢!
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();