Search code examples
.net-core.net-6.0itext7

Does PdfFormXObject cause lines to be lost in itext7?


Using itext7, when I enlarge the page size of a pdf file, I found that it caused the loss of elements outside the visible range. Code below.

string cardPdf = "card.pdf";float cardWidth = 266.5f;float cardHeight = 164.4f;
using (PdfDocument cardDoc = new PdfDocument(new PdfWriter(cardPdf)))
using (Document doc = new Document(cardDoc))
{
    PdfPage page = cardDoc.AddNewPage(new iText.Kernel.Geom.PageSize(cardWidth, cardHeight));
    Paragraph carePara = new Paragraph("CARD").SetFontSize(5f);
    doc.Add(carePara);

    PdfCanvas canvas = new PdfCanvas(page);
    canvas.SetFillColor(ColorConstants.LIGHT_GRAY);
    canvas.SetStrokeColor(ColorConstants.BLACK);
    canvas.SetLineWidth(1f);
    canvas.Rectangle(0, 0, cardWidth - 0.1f, cardHeight);
    canvas.SetLineWidth(0.1f);

    //Draw lines outside page visible area
    canvas.MoveTo(0f, -10f);
    canvas.LineTo(cardWidth, -10f);//----> a_line
    canvas.MoveTo(0f, cardHeight + 10f);
    canvas.LineTo(cardWidth, cardHeight + 10f);//----> b_line
    canvas.Stroke();
}
//to enlarge pdf
using (PdfDocument destPdf = new PdfDocument(new PdfWriter("enlarged.pdf")))
using (PdfDocument sourcePdf = new PdfDocument(new PdfReader(cardPdf)))
{
    var page = destPdf.AddNewPage(new PageSize(cardWidth+40f,cardHeight+40f));
    PdfFormXObject pageCopy = sourcePdf.GetFirstPage().CopyAsFormXObject(destPdf);
    PdfCanvas canvas = new PdfCanvas(page);
    canvas.AddXObjectAt(pageCopy,20f, 20f);//a_line and b_line are missing
}

Does PdfFormXObject cause lines to be lost? Is there any way to get the full page?


Solution

  • Following mkl's replay, the code below got me what I wanted.

    //to enlarge pdf
    using (PdfDocument destPdf = new PdfDocument(new PdfWriter("enlarged.pdf")))
    using (PdfDocument sourcePdf = new PdfDocument(new PdfReader(cardPdf)))
    {
    
        var page = destPdf.AddNewPage(new PageSize(cardWidth+40f,cardHeight+40));
        var oriPage = sourcePdf.GetFirstPage();
        var crop = oriPage.GetCropBox();
        //set a new cropbox
        oriPage.SetCropBox(new Rectangle(crop.GetX(), crop.GetY()-20f, crop.GetWidth(), crop.GetHeight()+40f));
        PdfFormXObject pageCopy = oriPage.CopyAsFormXObject(destPdf);
        
        PdfCanvas canvas = new PdfCanvas(page);
        canvas.AddXObjectAt(pageCopy,20f, 0f);
    }