Itextsharp设置trimbox在我的文档的第一页不起作用

本文关键字:第一页 不起作用 文档 我的 设置 trimbox Itextsharp | 更新日期: 2023-09-27 18:09:05

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

问题是,我的新PDF文件的第一页没有得到所要求的trimbox大小从原来的,但其余的…?

我使用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值,如果我将SetBoxSize移动到文档之后。NewPage,我仍然从第2页获得trimbox值,但然后我有来自前一页的trimbox !

任何帮助或提示将非常感激:)

PS:我已经做了一个真的肮脏的测试/解决方案,读取trixbox值并在循环中添加一个页面,然后循环使其正确,但留给我一个新的PDF文件,其中包含1页太多(当然,仍然有一个不正确的trimbox),但itextsharp不能删除页面。我搜索到的建议只是建议创建一个新的PDF,从头开始阅读所有内容并将其放入一个新文件中,这当然是自找麻烦!我可以使用别的东西而不是itextsharp来删除第1页,但我真的希望这工作应该:)

Itextsharp设置trimbox在我的文档的第一页不起作用

只要触发NewPage()(显式或隐式),页面就被初始化,其页面边界成为最终值。如果你可以在添加内容的过程中改变页面边界,就会出现奇怪的副作用。

一旦添加不再适合页面的内容,就会隐式触发

NewPage()。在本例中,将自动创建一个新页面。

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

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