iText7 C# Как извлечь (CROP / CLIP?) часть шаблона размером больше A4, чтобы объединить его с PDF PDF и получить A4? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть шаблон PDF, который немного больше, чем A4, и имеет перекрестие около каждого угла, чтобы указать размер страницы A4. Как мне искать, чтобы извлечь эту центрированную часть А4 из негабаритного PDF-файла, чтобы объединить его с другим PDF-файлом формата А4 и создать конечный PDF-файл формата А4?


. Я использовал этот код, адаптированный из Java примера. Он выглядит для Crop / Clip как I sh ... за исключением того, что он все равно заканчивается исходным размером страницы шаблона (больше, чем A4), а не A4, как я ожидал / хотел? Затем я должен решить, как объединить PDF-файл, содержащий текст, который нужно объединить с шаблоном, как только он станет форматом А4.

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

1 Ответ

0 голосов
/ 28 апреля 2020

так что, чтобы ответить на мой собственный вопрос, я не уверен, что это наиболее элегантно, но чтобы решить размер страницы, я добавил

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

и для слияния я добавил 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...