我认为您可能想让您的客户意识到您提到的任何库都不是完全免费的:
- iTextSharp 已获得 AGPL 许可,因此您必须发布解决方案的源代码或购买商业许可。
- PDFcompressNET 是一个商业图书馆。
- pdftk 是 GPL 许可的,因此您必须发布解决方案的源代码或购买商业许可证。
- Docotic.Pdf 是一个商业图书馆。
鉴于以上所有情况,我认为我可以放弃免费软件要求。
Docotic.Pdf 可以在不引入任何破坏性更改的情况下不同程度地减小压缩和未压缩 PDF的大小。
收益取决于 PDF 的大小和结构:对于小文件或主要是扫描图像的文件,减少可能不是那么好,因此您应该尝试使用文件库并亲自查看。
如果您最关心文件的大小并且文件中有很多图像,并且您可以丢失这些图像的某些质量,那么您可以使用 Docotic.Pdf 轻松重新压缩现有图像。
这是使所有图像双层并使用传真压缩进行压缩的代码:
static void RecompressExistingImages(string fileName, string outputName)
{
using (PdfDocument doc = new PdfDocument(fileName))
{
foreach (PdfImage image in doc.Images)
image.RecompressWithGroup4Fax();
doc.Save(outputName);
}
}
还有RecompressWithFlate
,RecompressWithGroup3Fax
和RecompressWithJpeg
方法。
如果需要,该库会将彩色图像转换为双层图像。您可以指定放气压缩级别、JPEG 质量等。
Docotic.Pdf 还可以在 PDF 中调整大图像的大小(并同时重新压缩它们)。如果文档中的图像实际上比需要的大,或者图像质量不那么重要,这可能很有用。
下面是缩放所有宽度或高度大于或等于 256 的图像的代码。然后使用 JPEG 压缩对缩放的图像进行编码。
public static void RecompressToJpeg(string path, string outputPath)
{
using (PdfDocument doc = new PdfDocument(path))
{
foreach (PdfImage image in doc.Images)
{
// image that is used as mask or image with attached mask are
// not good candidates for recompression
if (!image.IsMask && image.Mask == null && (image.Width >= 256 || image.Height >= 256))
image.Scale(0.5, PdfImageCompression.Jpeg, 65);
}
doc.Save(outputPath);
}
}
可以使用其中一种ResizeTo
方法将图像大小调整为指定的宽度和高度。请注意,该ResizeTo
方法不会尝试保留图像的纵横比。您应该自己计算适当的宽度和高度。
免责声明:我为 Bit Miracle 工作。