iText7 C#如何提取(CROP/CLIP?)大于A4的模板部分,与A4 PDF合并并生成A4



我有一个模板PDF,它比A4稍大,每个角落附近都有十字线,用来指示页面的A4大小部分。我应该如何从超大的PDF中提取居中的A4部分,与另一个A4 PDF合并,生成最终的A4 PDF?


所以将其分解为模板裁剪/剪辑问题。我使用了这段改编自Java示例的代码。它看起来确实像我希望的那样裁剪/剪裁。。。只是它最终仍然是原来的模板页面大小(大于A4(,而不是我预期/想要的A4?然后我必须弄清楚如何与pdf合并,其中包含要与模板合并的文本,一旦它是A4。

private void manipulatePdf(string sTemplate, string sDoc, string sOutput)
{
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(sOutput));
Document doc = new Document(pdfDoc, PageSize.A4);
doc.SetMargins(0f,0f,0f,0f);
PdfDocument docTemplateA4Plus = new PdfDocument(new PdfReader(sTemplate));
PdfDocument docTextA4 = new PdfDocument(new PdfReader(sDoc));
PdfPage pageTemplateA4Plus = docTemplateA4Plus.GetPage(1);
PdfPage pageTextA4 = docTextA4.GetPage(1);
iText.Kernel.Geom.Rectangle mediaBoxTemplateA4Plus =  pageTemplateA4Plus.GetMediaBox();
iText.Kernel.Geom.Rectangle mediaBoxTextA4 = pageTextA4.GetMediaBox();
float template_llx = mediaBoxTemplateA4Plus.GetX();
float template_lly = mediaBoxTemplateA4Plus.GetY();
float template_w = mediaBoxTemplateA4Plus.GetWidth();
float template_h = mediaBoxTemplateA4Plus.GetHeight();
float text_llx = mediaBoxTextA4.GetX();
float text_lly = mediaBoxTextA4.GetY();
float text_w = mediaBoxTextA4.GetWidth();
float text_h = mediaBoxTextA4.GetHeight();
float llx = ((template_w - text_w) / 2);
float lly = ((template_h - text_h) / 2);
float w = text_w;
float h = text_h;
docTemplateA4Plus.CopyPagesTo(1,1,pdfDoc);
string sCommand = "nq " + llx.ToString() + " " + lly.ToString() + " " + w.ToString() + " " + h.ToString() + " re W nnqn";
PdfPage pdfPage = pdfDoc.GetPage(1);
new PdfCanvas(pdfPage.NewContentStreamBefore(), pdfPage.GetResources(), pdfDoc)
.WriteLiteral(sCommand);
new PdfCanvas(pdfPage.NewContentStreamAfter(), pdfPage.GetResources(), pdfDoc)
.WriteLiteral("nQnQn");
doc.Close();
pdfDoc.Close();
}

所以为了回答我自己的问题,我不确定它是否最优雅,但为了解决页面大小问题,我添加了

var rect = new Rectangle(llx,lly,w,h);
pdfPage.SetMediaBox(rect);

对于合并,我在下面的完整代码中添加了靠近底部的5行与canvas相关的新行。

private void manipulatePdf(string sTemplate, string sDoc, string sOutput)
{
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(sOutput));
Document doc = new Document(pdfDoc, PageSize.A4);
doc.SetMargins(0f,0f,0f,0f);
PdfDocument docTemplateA4Plus = new PdfDocument(new PdfReader(sTemplate));
PdfDocument docTextA4 = new PdfDocument(new PdfReader(sDoc));
PdfPage pageTemplateA4Plus = docTemplateA4Plus.GetPage(1);
PdfPage pageTextA4 = docTextA4.GetPage(1);
iText.Kernel.Geom.Rectangle mediaBoxTemplateA4Plus =  pageTemplateA4Plus.GetMediaBox();
iText.Kernel.Geom.Rectangle mediaBoxTextA4 = pageTextA4.GetMediaBox();
float template_llx = mediaBoxTemplateA4Plus.GetX();
float template_lly = mediaBoxTemplateA4Plus.GetY();
float template_w = mediaBoxTemplateA4Plus.GetWidth();
float template_h = mediaBoxTemplateA4Plus.GetHeight();
float text_llx = mediaBoxTextA4.GetX();
float text_lly = mediaBoxTextA4.GetY();
float text_w = mediaBoxTextA4.GetWidth();
float text_h = mediaBoxTextA4.GetHeight();
float llx = ((template_w - text_w) / 2);
float lly = ((template_h - text_h) / 2);
float w = text_w;
float h = text_h;
var rect = new Rectangle(llx,lly,w,h);
docTemplateA4Plus.CopyPagesTo(1,1,pdfDoc);
string sCommand = "nq " + llx.ToString() + " " + lly.ToString() + " " + w.ToString() + " " + h.ToString() + " re W nnqn";
PdfPage pdfPage = pdfDoc.GetPage(1);
new PdfCanvas(pdfPage.NewContentStreamBefore(), pdfPage.GetResources(), pdfDoc)
.WriteLiteral(sCommand);
new PdfCanvas(pdfPage.NewContentStreamAfter(), pdfPage.GetResources(), pdfDoc)
.WriteLiteral("nQnQn");
pdfPage.SetMediaBox(rect);
PdfCanvas canvas = new PdfCanvas(pdfDoc.GetFirstPage().NewContentStreamBefore(), pdfDoc.GetFirstPage().GetResources(), pdfDoc);
PdfFormXObject page;
srcDoc = new PdfDocument(new PdfReader(path));
page = srcDoc.GetFirstPage().CopyAsFormXObject(pdfDoc);
canvas.AddXObject(page, 0, 0);
doc.Close();
pdfDoc.Close();
}

最新更新