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()
之后生效。
我已经为此苦苦挣扎了一段时间!我需要将各种 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()
之后生效。