Jak kompresować pliki PDF w C# używając IronPDF
IronPDF kompresuje PDF w C# za pomocą metody CompressAndSaveAs, która przekodowuje osadzone obrazy jako JPEG i opcjonalnie usuwa strukturę drzewa PDF, aby zmniejszyć rozmiar pliku w jednym wywołaniu. Metody towarzyszące CompressPdfToBytes i CompressPdfToStream wykonują to samo zadanie w pamięci, gdy nigdy nie chcesz dotykać dysku.
Obrazy zwykle stanowią większość rozmiaru pliku PDF, a dokumenty z dużą ilością tabel mają drzewo struktury, które dodatkowo zwiększa wagę. IronPDF celuje w oba, więc to samo wywołanie działa na plikach PDF załadowanych z dysku lub przechowywanych w strumieniu pamięci.
Szybki start: Kompresuj pliki PDF z IronPDFZaładuj swój PDF za pomocą PdfDocument.FromFile i wywołaj CompressAndSaveAs, aby przekodować jego obrazy i zapisać zredukowaną kopię w jednym kroku. Drugi argument to jakość JPEG.
-
1Install IronPDF with NuGet Package Manager
-
2Skopiuj i uruchom ten fragment kodu.
PdfDocument.FromFile("input.pdf").CompressAndSaveAs("compressed.pdf", 40);PdfDocument.FromFile("input.pdf").CompressAndSaveAs("compressed.pdf", 40) -
3Wdrożenie do testowania w środowisku produkcyjnym
Rozpocznij używanie IronPDF w swoim projekcie już dziś z darmową wersją próbną
Minimalny przepływ pracy (3 kroki)
- Pobierz bibliotekę C# do kompresji PDF z NuGet
- Zaimportuj istniejący PDF lub renderuj nowy PDF
- Wywołaj
CompressAndSaveAs(outputPath, quality, removeStructureTree), aby skompresować obrazy, opcjonalnie usunąć drzewo struktury i zapisać wynik
CompressImages, CompressStructTree i Compress(CompressionOptions), są przestarzałe.Jak skompresować obrazy w plikach PDF?
Przekaż wartość JPEG quality jako drugi argument do CompressAndSaveAs, a IronPDF przekoduje każdy osadzony obraz w tej jakości. Wartości wahają się od 0 (maksymalna kompresja) do 100 (minimalna strata), a podstawowa jednostka decyduje, jak każda wartość przypisuje się do wynikowego obrazu. Ta metoda najlepiej nadaje się do dokumentów z osadzonymi obrazami.
Jako ogólny przewodnik:
- 90 i wyżej: wysoka jakość
- 80 do 90: średnia jakość
- 70 do 80: niska jakość
Niższa liczba bardziej kompresuje, ale może wprowadzić widoczne artefakty, a spadek przejrzystości zależy od obrazu źródłowego, więc przetestuj kilka ustawień na własnym materiale, aby znaleźć równowagę, którą chcesz.
Dane wejściowe
using IronPdf;
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/Main_Page");
// Quality 40 re-encodes every embedded image as a low-quality JPEG, which is
// where most of the file-size saving comes from in image-heavy PDFs
pdf.CompressAndSaveAs("compressed.pdf", 40);Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/Main_Page")
' Quality 40 re-encodes every embedded image as a low-quality JPEG, which is
' where most of the file-size saving comes from in image-heavy PDFs
pdf.CompressAndSaveAs("compressed.pdf", 40)Wynik
Jakich rezultatów mogę oczekiwać po kompresji obrazów?
Zmniejszono o 39,24% w przypadku renderowania Wikipedii.

Jak skompresować strukturę drzewa pliku PDF?
Przekaż removeStructureTree: true jako trzeci argument do CompressAndSaveAs, aby usunąć strukturę drzewa, którą silnik Chrome zapisuje w pliku PDF. Oszczędności są największe na plikach PDF z silnika Chrome, które zawierają rozległe dane tabelaryczne. Niektóre silniki renderujące nie emitują takiej struktury, co powoduje, że funkcja nie ma czego usunąć.
Usunięcie drzewa może osłabić podświetlanie tekstu i wybór, więc rozważ to przeciw oszczędności miejsca, jeśli czytniki będą później musiały wyodrębniać tekst i obrazy z wyniku.
Przetestuj CompressAndSaveAs z usunięciem struktury drzewa, używając tego PDF z danymi tabeli.
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("table.pdf");
// Pass null quality to skip image compression and true to drop the structure
// tree, which is the bulk of the size in table-heavy Chrome-rendered PDFs
pdf.CompressAndSaveAs("compressedTable.pdf", null, true);Imports IronPdf
Dim pdf As PdfDocument = PdfDocument.FromFile("table.pdf")
' Pass nothing as quality to skip image compression and True to drop the structure
' tree, which is the bulk of the size in table-heavy Chrome-rendered PDFs
pdf.CompressAndSaveAs("compressedTable.pdf", Nothing, True)Jakie zmniejszenie rozmiaru pliku można osiągnąć dzięki kompresji struktury drzewa?
Zmniejszono o 67,90%. Wskaźnik rośnie wraz ze wzrostem pliku tabeli PDF.

Jak mogę zastosować obie metody kompresji jednocześnie?
Podaj wartość quality i ustaw removeStructureTree na true w tej samej funkcji CompressAndSaveAs, aby jednocześnie zmniejszyć oba źródła nadmiarowych danych. To powiązanie sprawdza się w dokumentach, które łączą obrazy ze strukturalnymi danymi, takich jak raporty z wykresami czy faktury z osadzonymi tabelami.
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("sample.pdf");
// Shrink both sources of bloat in one pass: re-encode images at quality 80
// and strip the structure tree (true) for the largest size reduction
pdf.CompressAndSaveAs("compressed.pdf", 80, true);Imports IronPdf
Dim pdf As PdfDocument = PdfDocument.FromFile("sample.pdf")
' Shrink both sources of bloat in one pass: re-encode images at quality 80
' and strip the structure tree (true) for the largest size reduction
pdf.CompressAndSaveAs("compressed.pdf", 80, True)Jakie parametry akceptuje CompressAndSaveAs?
-
outputPath(string): Ścieżka do pliku, gdzie zapisany jest skompresowany PDF. -
quality(int?, od 0 do 100): Jakość JPEG stosowana do każdego osadzonego obrazu. Niższe wartości powodują tworzenie mniejszych plików. Przekażnull, aby całkowicie pominąć kompresję obrazu. -
removeStructureTree(bool, domyślniefalse): Gdytrue, usuwa strukturę drzewa PDF, aby dodatkowo zmniejszyć rozmiar pliku. Najbardziej efektywne dla plików PDF generowanych z HTML z tabelami.
Niech przypadek użycia ustawi knoba. Kopie archiwalne często preferują jakość nad rozmiarem, podczas gdy dystrybucja w sieci nagradza mniejszy plik. To samo przemienne odniesienie odnosi się, gdy kompresujesz dokumenty zgodne z PDF/A, gdzie wierność obrazów może być priorytetem.
Jak mogę uzyskać szczegółowe sterowanie kompresją?
Dla większości dokumentów wystarczające jest wywołanie dwoma argumentami, ale archiwa z dużą ilością obrazów i ścisłe budżety wielkości czasami wymagają większej kontroli. Przekaż obiekt AdvancedCompressionOptions do CompressAndSaveAs, aby dostosować potok kompresji, w tym skalowanie w dół DPI obrazów, jakość ponownego kodowania JPEG i poziom kompresji zlib. Prostsze przeciążenie CompressAndSaveAs(outputPath, quality, removeStructureTree) nadal działa bez zmian i generuje takie samo wyjście jak wcześniej.
using IronPdf;
var pdf = PdfDocument.FromFile("input.pdf");
// Web or email: strong size reduction
pdf.CompressAndSaveAs("compressed.pdf", new AdvancedCompressionOptions
{
JpegQuality = 70,
TargetImageDpi = 150,
RemoveStructureTree = true
});
// Print quality: minimal quality loss
pdf.CompressAndSaveAs("print.pdf", new AdvancedCompressionOptions
{
JpegQuality = 90,
TargetImageDpi = 300
});Imports IronPdf
Dim pdf = PdfDocument.FromFile("input.pdf")
' Web or email: strong size reduction
pdf.CompressAndSaveAs("compressed.pdf", New AdvancedCompressionOptions With {
.JpegQuality = 70,
.TargetImageDpi = 150,
.RemoveStructureTree = True
})
' Print quality: minimal quality loss
pdf.CompressAndSaveAs("print.pdf", New AdvancedCompressionOptions With {
.JpegQuality = 90,
.TargetImageDpi = 300
})Dwie właściwości, które mają największy wpływ, to JpegQuality i TargetImageDpi:
JpegQuality(int?, od 1 do 100, domyślnienull): Przekodowuje obrazy w tej jakości JPEG. Pozostaw jenull, aby całkowicie pominąć ponowne kodowanie obrazu.TargetImageDpi(int?, domyślnie150): Skalowanie w dół obrazów, których efektywne DPI przekracza tę wartość przed ponownym kodowaniem. Ustaw je nanulllub0, aby wyłączyć zmniejszanie rozdzielczości i zachować oryginalną.
Zalecane wartości JpegQuality (dotyczy tylko gdy ustawione):
| Wartość | Użyj przypadku |
|---|---|
null (domyślnie) | Brak ponownego kodowania obrazu |
95 | Archiwum, minimalne artefakty |
85 | Wysoka jakość |
70 | Wyważony, dobry dla ogólnego użytku |
50 | Internet lub e-mail, mniejsze pliki z widocznymi artefaktami |
Zalecane wartości TargetImageDpi (stratne):
| Wartość | Użyj przypadku |
|---|---|
300 | Jakość druku, bez strat dla oka przy normalnej odległości oglądania |
200 | Ostrość na ekranach o wysokim DPI i retina |
150 (domyślnie) | Najlepszy balans między wielkością a jakością dla ekranu i e-maila |
96 | Agresywne, miękki tekst ale nadal czytelny |
null lub 0 | Wyłączone, zachowuje oryginalną rozdzielczość |
TargetImageDpi zmniejszanie rozdzielczości jest stratne: gdy obraz jest zmniejszany, jego oryginalna rozdzielczość nie może zostać przywrócona. Zdecyduj wcześniej, czy chcesz redukcję rozdzielczości, czy tylko ponowne kodowanie w celu poprawy jakości, i ustaw TargetImageDpi odpowiednio.Jak skompresować pliki PDF bez zapisywania ich na dysku?
Odpowiedzi API, funkcje w chmurze i załączniki e-mail rzadko potrzebują skompresowanego PDF na dysku. CompressPdfToBytes zwraca wynik jako tablica bajtów, więc Ty decydujesz, gdzie bajty trafią dalej.
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("sample.pdf");
// Return the compressed PDF as bytes so it can go straight into an HTTP
// response, a database varbinary column, or a queue message with no temp file
byte[] compressedBytes = pdf.CompressPdfToBytes();
File.WriteAllBytes("compressed.pdf", compressedBytes);Imports IronPdf
Dim pdf As PdfDocument = PdfDocument.FromFile("sample.pdf")
' Return the compressed PDF as bytes so it can go straight into an HTTP
' response, a database varbinary column, or a queue message with no temp file
Dim compressedBytes As Byte() = pdf.CompressPdfToBytes()
File.WriteAllBytes("compressed.pdf", compressedBytes)Jeśli potrzebujesz Stream zamiast tablicy bajtów, wywołaj CompressPdfToStream i skopiuj to do swojej destynacji. To pasuje do przesyłania danych do korpusu odpowiedzi HTTP, przesyłania do chmury lub wszelkich przepływów pracy opartych na strumieniach.
using IronPdf;
using System.IO;
PdfDocument pdf = PdfDocument.FromFile("sample.pdf");
// Stream output so the compressed bytes can be piped straight to an HTTP
// response or cloud upload without first buffering the whole file as byte[]
using Stream compressedStream = pdf.CompressPdfToStream();
// CompressPdfToStream returns a read-only Stream, so copy it to the destination
using FileStream fileStream = File.Create("compressed.pdf");
compressedStream.CopyTo(fileStream);Imports IronPdf
Imports System.IO
Dim pdf As PdfDocument = PdfDocument.FromFile("sample.pdf")
' Stream output so the compressed bytes can be piped straight to an HTTP
' response or cloud upload without first buffering the whole file as byte[]
Using compressedStream As Stream = pdf.CompressPdfToStream()
' CompressPdfToStream returns a read-only Stream, so copy it to the destination
Using fileStream As FileStream = File.Create("compressed.pdf")
compressedStream.CopyTo(fileStream)
End Using
End UsingJakie opcje CompressionTryb są dostępne?
Zarówno CompressPdfToBytes, jak i CompressPdfToStream przyjmują opcjonalny argument CompressionTryb, który decyduje, jak zadanie będzie wykonywane. Docelowe platformy wdrożenia różnią się, czy pozwalają na dostęp do dysku, a tryb pozwala wybrać odpowiedni kompromis:
| Tryb | Dostęp do dysku | Przepróbki obrazu | Rozmiar wyjściowy |
|---|---|---|---|
Automatic (domyślnie) | Próbuje na dysku, wraca do pamięci | Gdy dysk jest dostępny | Najmniejszy, gdzie dozwolone |
FastMemory | Niene | Nie | Większy |
HighQuality | Wymagany katalog tymczasowy | Tak | Najmniejszy |
Automatic próbuje najpierw HighQuality, a następnie spada do FastMemory, gdy katalog tymczasowy jest niedostępny. Przykład poniżej wymusza HighQuality dla najmniejszego wyjścia, które wymaga dostępu zapisu do systemowego katalogu temp w czasie działania.
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("sample.pdf");
// HighQuality resamples images using the system temp directory, so it produces
// the smallest output but needs write access to that directory at runtime
byte[] compressedBytes = pdf.CompressPdfToBytes(50, false, CompressionMode.HighQuality);
File.WriteAllBytes("compressed.pdf", compressedBytes);Imports IronPdf
Dim pdf As PdfDocument = PdfDocument.FromFile("sample.pdf")
' HighQuality resamples images using the system temp directory, so it produces
' the smallest output but needs write access to that directory at runtime
Dim compressedBytes As Byte() = pdf.CompressPdfToBytes(50, False, CompressionMode.HighQuality)
File.WriteAllBytes("compressed.pdf", compressedBytes)Wynik
CompressPdfToBytes i CompressPdfToStream są teraz dostępne na wszystkich platformach IronPDF, w tym Java, Niede.js i Python.
Wnioski
Masz teraz jedną metodę, CompressAndSaveAs, która ponownie koduje obrazy i zdziera strukturę drzewa, plus CompressPdfToBytes i CompressPdfToStream dla tej samej pracy w pamięci pod wybranym CompressionTryb. Naturalnym następnym krokiem jest przekształcenie odchudzonych stron na miniatury za pomocą rasteryzacji PDF.
Często Zadawane Pytania
O ile można zmniejszyć rozmiar pliku PDF dzięki kompresji?
Wyniki różnią się w zależności od zawartości. W przedstawionych przykładach, kompresja obrazu zmniejszyła plik o 39,24%, a usunięcie drzewa struktury zmniejszyło tabelo- intensywny PDF o 67,90%. Dokumenty o dużej ilości obrazów i tabel widzą największe oszczędności.
Jak IronPDF kompresuje pliki PDF w C#?
IronPDF obsługuje kompresję poprzez jedną metodę - CompressAndSaveAs. Zmniejsza rozmiary osadzonych obrazów, używając konfigurowalnej jakości JPEG (0–100) i opcjonalnie może usunąć wewnętrzną strukturę drzewa PDF, ustawiając removeStructureTree: true, co jest szczególnie skuteczne dla dokumentów z dużymi tabelami.
Jakie poziomy jakości powinienem używać do kompresji JPEG w PDF?
IronPDF obsługuje jakość kompresji JPEG od 1% do 100%. Zalecane poziomy to: 90% i więcej dla wysokiej jakości, 80%-90% dla średniej jakości i 70%-80% dla niskiej jakości. Optymalne ustawienie zależy od równowagi między rozmiarem pliku a wymaganiami jakości wizualnej.
Czy mogę skompresować PDF w zaledwie jednej linii kodu?
Tak, IronPDF pozwala na kompresję PDF w jednej linii kodu: PdfDocument.FromFile("input.pdf").CompressAndSaveAs("compressed.pdf", 40); To ładuje PDF, kompresuje obrazy przy 40% jakości i zapisuje wynik.
Czy kompresja działa z plikami PDF utworzonymi z HTML?
Tak, kompresja IronPDF działa z PDF-ami stworzonymi na różne sposoby, w tym konwersje HTML string do PDF, konwersje URL do PDF i konwersje pliku HTML, jak również istniejące pliki PDF.
Jakie typy zawartości najbardziej korzystają z kompresji PDF?
Obrazy zazwyczaj zajmują większość rozmiarów plików PDF, co czyni dokumenty bogate w obrazy idealnymi kandydatami do kompresji. Ponadto, PDF złożone z dużych struktur tabelarycznych korzystają z funkcji kompresji struktury drzewa w IronPDF.
Czy mogę skompresować PDF bez zapisywania go na dysku?
Tak, IronPDF oferuje metody CompressPdfToBytes i CompressPdfToStream, które zwracają skompresowany PDF jako tablicę bajtów lub Strumień odpowiednio. Obie akceptują opcjonalny parametr CompressionMode z opcjami dla automatycznej, szybkiej pamięci lub wysokiej jakości kompresji.
Czy kompresja PDF jest dostępna w innych językach niż C#?
Tak, CompressPdfToBytes i CompressPdfToStream są teraz dostępne na wszystkich platformach IronPDF, w tym Java, Node.js i Python.
Jak uzyskać szczegółową kontrolę nad kompresją PDF w C#?
Przekaż obiekt AdvancedCompressionOptions do CompressAndSaveAs, aby dostosować potok, w tym też zmniejszenie rozdzielczości obrazów DPI za pomocą TargetImageDpi, jakość ponownego kodowania JPEG przez JpegQuality, oraz poziom kompresji zlib poprzez CompressionLevel. Oryginalne przeciążenie CompressAndSaveAs(outputPath, quality, removeStructureTree) nadal działa i produkuje ten sam wynik, co przedtem.
How can I achieve fine-grained control over PDF compression in IronPDF?
For fine-grained control, IronPDF allows you to pass an `AdvancedCompressionOptions` object to the `CompressAndSaveAs` method, letting you adjust JPEG quality, image DPI downsampling, and zlib compression levels.
How do I compress black-and-white scans in IronPDF?
Set `BitonalMode` to `BitonalCompressionMode.Force` on an `AdvancedCompressionOptions` object and pass it to `CompressAndSaveAs`. IronPDF thresholds each eligible image to 1-bit and encodes it as CCITT Group 4, keeping the result only when it is smaller. It is off by default and is intended for scanned text, faxes and line art rather than colour or photographic content.
Why does my scan look softer after setting BitonalMode to Force?
`BitonalResolutionDpi` is `null` by default, which falls back to `TargetImageDpi`, and `TargetImageDpi` defaults to `150`. Setting only `BitonalMode` therefore downsamples a 300 DPI scan to 150 DPI before thresholding it. Set `BitonalResolutionDpi` explicitly, or set `TargetImageDpi` to `null`, to threshold at the original resolution.
What does BitonalThreshold do in IronPDF?
`BitonalThreshold` is the luminance cutoff from `1` to `255` that decides whether a pixel becomes black or white. Leave it `null`, the default, and IronPDF computes a threshold per image using Otsu's method, which handles scans that vary in exposure. A value of `0`, or anything outside `1` to `255`, falls back to the automatic threshold.
Can I use bitonal compression with CompressPdfToBytes or CompressPdfToStream?
No. Bitonal compression is only available through the `CompressAndSaveAs` overloads that accept an `AdvancedCompressionOptions` object. `CompressPdfToBytes` and `CompressPdfToStream` take a JPEG quality value instead, so the in-memory paths cannot produce CCITT Group 4 output.

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.