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

itextsharp setting trimbox does not work on first page in my document

我已经为此苦苦挣扎了一段时间!我需要将各种 PDF 文件合并到一个文件中,因为合并后图形使用需要这样做,所以我需要维护原始文件中的 trimbox(es)。

问题是我的新 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:我已经做了一个 really 脏测试/解决方法,读取 trixbox 值并在循环中添加一个页面,然后循环获取它正确,但给我留下了一个包含 1 页过多的新 PDF 文件(当然仍然有一个不正确的裁切框),但 itextsharp 无法删除页面。我搜索的建议只是建议创建一个新的 PDF,从头开始阅读所有内容并将其放入一个新文件中,这当然会咬到自己的尾巴!我可以使用 itextsharp 以外的其他东西来删除第 1 页,但我真的希望它能按预期工作:)

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

一旦您添加不再适合页面的内容,

NewPage() 就会隐式触发。在这种情况下,将自动创建一个新页面。

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

如果要为第一页定义裁切框,需要在之前document.Open()设置它。如果你在之后一个document.NewPage()改变一个页面边界,它只会在下一个document.NewPage()之后生效。