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

iText7 C# how extract (CROP/CLIP?) part of template larger than A4 to merge with an A4 PDF and result in A4?

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


因此将其分解为模板 crop/clip 问题。我使用了改编自 Java 示例的代码。它确实如我所愿 Crop/Clip 出现......除了它仍然以原始模板页面大小(大于 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 n\nq\n";
    PdfPage pdfPage = pdfDoc.GetPage(1);
    new PdfCanvas(pdfPage.NewContentStreamBefore(), pdfPage.GetResources(), pdfDoc)
    .WriteLiteral(sCommand);
    new PdfCanvas(pdfPage.NewContentStreamAfter(), pdfPage.GetResources(), pdfDoc)
    .WriteLiteral("\nQ\nQ\n");
    doc.Close();
    pdfDoc.Close();
}

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

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

为了合并,我在下面的完整代码中添加了与 canvas 相关的 5 条新行。

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 n\nq\n";
    PdfPage pdfPage = pdfDoc.GetPage(1);
    new PdfCanvas(pdfPage.NewContentStreamBefore(), pdfPage.GetResources(), pdfDoc)
    .WriteLiteral(sCommand);
    new PdfCanvas(pdfPage.NewContentStreamAfter(), pdfPage.GetResources(), pdfDoc)
    .WriteLiteral("\nQ\nQ\n");

    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();
}