iTextSharp-添加图像并调整PDF页面的大小

问题描述 投票:2回答:2

我有一个PDF文件,需要在第一页上插入图像,然后将原始尺寸从A4调整为其他尺寸。

我设法将图像添加到PDF中,但没有使用以下代码调整其大小:

        string pdfFile = @"C:\Temp\a.pdf";

        PdfReader reader = new PdfReader(pdfFile);

        PdfStamper stamper = new PdfStamper(reader, new FileStream(@"C:\Temp\out.pdf", FileMode.Create), PdfWriter.VERSION_1_5);

        PdfContentByte writer = stamper.GetOverContent(1);

        stamper.FormFlattening = true;
        stamper.SetFullCompression();

        Image topImage = Image.GetInstance(@"C:\Temp\c.jpg");
        topImage.ScalePercent(19f);
        topImage.SetAbsolutePosition(142, 700);
        writer.AddImage(topImage);

        Document myPDF = writer.PdfDocument;
        myPDF.SetPageSize(PageSize.A3);

        stamper.Close();
        stamper = null;

我的代码中是否存在任何错误或缺失?

itextsharp
2个回答
2
投票

下面是如何调整PDF的大小:

    private string PdfResize(string tmpPdfFilename, string resultRootName)
    {
        try
        {
            string newPdfFilename = resultRootName + ".pdf";
            PdfReader resizeReader = new PdfReader(tmpPdfFilename);

            Rectangle newRect = new Rectangle(0, 0, Convert.ToSingle(_pdfNewSizeW), Convert.ToSingle(_pdfNewSizeH));
            Document doc = new Document(newRect);
            Document.Compress = true;

            PdfWriter resizeWriter = PdfWriter.GetInstance(doc, new FileStream(newPdfFilename, FileMode.Create));
            doc.Open();

            PdfContentByte cb = resizeWriter.DirectContent;

            for (int pageNumber = 1; pageNumber <= resizeReader.NumberOfPages; pageNumber++)
            {
                PdfImportedPage page = resizeWriter.GetImportedPage(resizeReader, pageNumber);
                cb.AddTemplate(page, newRect.Width / resizeReader.GetPageSize(pageNumber).Width, 0, 0,
                               newRect.Height / resizeReader.GetPageSize(pageNumber).Height, 0, 0);
                doc.NewPage();
            }

            doc.Close();
            doc = null;

            return newPdfFilename;
        }
        catch (Exception exp)
        {
            return String.Empty;
        }
    }

0
投票

尽管是较旧的主题,但最近的原始问题和主题非常有帮助。

这里是另一个版本,将Pdf输入作为字节数组而不是文件路径来处理(对Web应用程序环境更有用,并处理所有IDisposable引用...

    public static byte[] ResizePdfPageSize(byte[] pdfBytes, Rectangle pageSize)
    {
        Document.Compress = true;

        using (var outputMemoryStream = new MemoryStream())
        using (var targetDoc = new Document(pageSize))
        using (var pdfReader = new PdfReader(pdfBytes))
        using (var pdfWriter = PdfWriter.GetInstance(targetDoc, outputMemoryStream))
        {
            targetDoc.Open();

            PdfContentByte pdfContentByte = pdfWriter.DirectContent;

            var pageCount = pdfReader.NumberOfPages;
            for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++)
            {
                PdfImportedPage page = pdfWriter.GetImportedPage(pdfReader, pageNumber);

                var currentPageSize = pdfReader.GetPageSize(pageNumber);
                var scaledPageWidth = pageSize.Width / currentPageSize.Width;
                var scaledPageHeight = pageSize.Height / currentPageSize.Height;

                pdfContentByte.AddTemplate(
                        page,
                        scaledPageWidth,
                        0, 0,
                        scaledPageHeight,
                        0, 0
                    );

                //Move document cursor to next Page!
                targetDoc.NewPage();
            }

            targetDoc.Close();

            byte[] finalFileBytes = outputMemoryStream.ToArray();
            return finalFileBytes;
        }
    }

使用来自iTextSharp的预设PageSizes非常方便:

 var originalPdfBytes = File.ReadAllBytes(fileInfo.FullName);
 var resizedBytes = PdfHelper.ResizePdfPageSize(originalPdfBytes, PageSize.A4);
 File.WriteAllBytes(fileName, resizedBytes);
© www.soinside.com 2019 - 2024. All rights reserved.