开发者

Centering an pdfimportedpage in iTextSharp

开发者 https://www.devze.com 2022-12-14 13:23 出处:网络
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 p

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.Lef开发者_JAVA技巧tMargin - 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);                    
            }
        }
    }


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?

0

精彩评论

暂无评论...
验证码 换一张
取 消