iTextSharp - 以PDF格式添加图像和调整页面大小

时间:2012-03-07 02:09:20

标签: itextsharp

我有一个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;

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

2 个答案:

答案 0 :(得分: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;
        }
    }

答案 1 :(得分:1)

尽管主题较旧,最近的问题和线索还是很有帮助。

这是另一个版本,它将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);

编辑:以上方法回答了核心问题,并为我提供了解决我所需要的问题的位置。但是,在解决了这一问题并解决了上述简化方法的众多问题和缺点之后,我现在将整个有用的代码库放在github上,以分享给其他感兴趣的人。 github PdfHelpers项目现在可以更好地处理宽高比,页面边距,旋转内容以更好地缩放为横向,已经旋转的内容(在我有限的测试用例中)等,同时还提供了其他有用的代码来完成简单的Pdf任务。

https://github.com/cajuncoding/PdfHelpers