views:

646

answers:

1

Hi guys,

I am appending PDFs together using the function below via iTextSharp. Its working fine. The only problem is that PDFs that are larger than the set size of the document (A4), ends up being scaled and placed at the bottom left corner of the document. I would like to centre it. Can anyone point me in the right direction to achieving this? Cheers.

    private void appendPDF(appendDoc doc)
    {
        PdfContentByte pdfContentByte = pdfWriter.DirectContent;
        PdfReader pdfReader = null;

        if (doc.MemoryStream != null && doc.MemoryStream.CanRead)
        {
            pdfReader = new PdfReader(doc.MemoryStream);
        }
        else if (File.Exists(doc.FullFilePath))
        {
            pdfReader = new PdfReader(doc.FullFilePath);
        }

        if (pdfReader != null)
        {
            for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++)
            {                    
                PdfImportedPage importedPage = pdfWriter.GetImportedPage(pdfReader, pageIndex);

                float importedPageXYRatio = importedPage.Width / importedPage.Height;

                if (XYRatio > 1f)
                {
                   iTextDocument.SetPageSize(PageSize.A4.Rotate());
                }
                else
                {
                   iTextDocument.SetPageSize(PageSize.A4);
                }

                iTextDocument.NewPage();
                pdfContentByte.AddTemplate(importedPage, 0, 0);

            }
        }
    }

Edit:

This was the solution I ended up using.

private void appendPDF(appendDoc doc)
    {
        PdfContentByte pdfContentByte = pdfWriter.DirectContent;
        PdfReader pdfReader = null;

        if (doc.MemoryStream != null && doc.MemoryStream.CanRead)
        {
            pdfReader = new PdfReader(doc.MemoryStream);
        }
        else if (File.Exists(doc.FullFilePath))
        {
            pdfReader = new PdfReader(doc.FullFilePath);
        }

        if (pdfReader != null)
        {
            for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++)
            {                    
                PdfImportedPage importedPage = pdfWriter.GetImportedPage(pdfReader, pageIndex);

                float importedPageXYRatio = importedPage.Width / importedPage.Height;

                if (XYRatio > 1f)
                {
                   iTextDocument.SetPageSize(PageSize.A4.Rotate());
                }
                else
                {
                   iTextDocument.SetPageSize(PageSize.A4);
                }                  

                iTextDocument.NewPage();

                var truePageWidth = iTextDocument.PageSize.Width - iTextDocument.LeftMargin - iTextDocument.RightMargin;
                var truePageHeight = iTextDocument.PageSize.Height - iTextDocument.TopMargin - iTextDocument.BottomMargin;

                var x = (truePageWidth - importedPage.Width) / 2 + iTextDocument.RightMargin;
                var y = (truePageHeight - importedPage.Height) / 2 + iTextDocument.BottomMargin;

                pdfContentByte.AddTemplate(importedPage, x, y);                    
            }
        }
    }
A: 

Can you set the x-coordinate when you call AddTemplate?

Float offset = 0;
if(importedPage.width < iTextDocument.PageSize.Width) {
   offset = (iTextDocument.PageSize.Width - importedPage.width)/2;
}
pdfContentByte.AddTemplate(importedPage, offset, 0);

Or does it do the scaling in AddTemplate so you don't know the final width?

sbrogers
It does the scaling already. I applied a similar solution (except I took into account the document's margins) Works very well.
pwee167