如何通过iTextSharp将byte[]格式PDF页面修改为A4并保存?
It looks like your current attempts either only handle a single page with arbitrary scaling or fail to preserve the original PDF content entirely. Let's break down a reliable, straightforward solution to resize all pages of your PDF to A4, while ensuring the content scales and centers correctly.
The Correct Approach with PdfStamper
Instead of creating a new document and importing pages (which can lead to scaling inconsistencies), we'll use PdfStamper to modify the existing PDF directly. This lets us adjust page dimensions and transform content to fit A4 properly without rebuilding the document from scratch.
Here's the complete, tested method:
using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; using System; public static byte[] ResizePdfToA4(byte[] pdfBytes) { using (var inputStream = new MemoryStream(pdfBytes)) using (var outputStream = new MemoryStream()) { // Read the original PDF from your byte array var reader = new PdfReader(inputStream); // Create a stamper to modify the PDF in-place var stamper = new PdfStamper(reader, outputStream); // Define A4 page dimensions (use PageSize.A4.Rotate() for landscape if needed) var a4Size = PageSize.A4; float a4Width = a4Size.Width; float a4Height = a4Size.Height; // Process every page in the PDF for (int pageNum = 1; pageNum <= reader.NumberOfPages; pageNum++) { // Get the original page's size var originalPage = reader.GetPageSize(pageNum); float originalWidth = originalPage.Width; float originalHeight = originalPage.Height; // Calculate scaling factor to fit content within A4 (maintains aspect ratio) float scaleX = a4Width / originalWidth; float scaleY = a4Height / originalHeight; float scale = Math.Min(scaleX, scaleY); // Update the page's MediaBox and CropBox to A4 size var pageDict = reader.GetPageN(pageNum); pageDict.Put(PdfName.MEDIABOX, new PdfRectangle(a4Size)); pageDict.Put(PdfName.CROPBOX, new PdfRectangle(a4Size)); // Adjust content to scale and center it on the A4 page var content = stamper.GetUnderContent(pageNum); content.SaveState(); // Calculate offset to center the scaled content float offsetX = (a4Width - (originalWidth * scale)) / 2; float offsetY = (a4Height - (originalHeight * scale)) / 2; // Apply transformation: translate first, then scale content.ConcatCTM(scale, 0, 0, scale, offsetX, offsetY); content.RestoreState(); } // Clean up resources stamper.Close(); reader.Close(); // Return the resized PDF as a byte array return outputStream.ToArray(); } }
How to Use This Method
To save the resized PDF to a file, simply pass your original byte array to the method and write the result to disk:
// Your original PDF byte array byte[] originalPdf = ...; // Resize all pages to A4 byte[] a4Pdf = ResizePdfToA4(originalPdf); // Save the result to a file File.WriteAllBytes(@"C:\path\to\your\output.pdf", a4Pdf);
What Was Wrong with Your Original Approaches?
- Method 1: You only processed the first page, used a hardcoded 30% scaling (which won't work for all page sizes), and had conflicting stream/PdfWriter instances. This led to incomplete or incorrectly scaled output.
- Method 2: You created an empty A4 document but never imported any content from the original PDF. The result was just a blank file with no actual content.
内容的提问来源于stack exchange,提问作者xtra

