gpt4 book ai didi

c# - 使用免费软件库使用 C# 编程压缩现有 PDF

转载 作者:IT王子 更新时间:2023-10-29 04:43:47 25 4
gpt4 key购买 nike

我在 Google 上搜索了很多有关如何压缩现有 pdf(大小)的信息。我的问题是

  1. 我不能使用任何应用程序,因为它需要由 C# 程序来完成。

  2. 我无法使用任何付费图书馆,因为我的客户不想超出预算。所以付费图书馆肯定是NO

我做了最后 2 天的功课,想出了一个使用 iTextSharp、BitMiracle 的解决方案,但无济于事,因为前者只减少了文件的 1%,而后者是付费的。

我还遇到了 PDFcompressNET 和 pdftk,但我找不到它们的 .dll。

实际上,pdf 是保险单,包含 2-3 张图片(黑白)和大约 70 页,大小为 5 MB。

我只需要pdf格式的输出(不能是任何其他格式)

最佳答案

这是执行此操作的方法(无论您使用的工具包如何,这都应该有效):

如果您有 24 位 rgb 或 32 位 cmyk 图像,请执行以下操作:

  • 确定图像是否真实。如果是cmyk,就转成rgb。如果它是 rgb 并且真的是灰色,则转换为灰色。如果它是灰色或调色板并且只有 2 种真实颜色,请转换为 1 位。如果它是灰色的并且灰度变化相对较小,请考虑使用合适的二值化技术转换为 1 位。
  • 根据图像在页面上的放置方式测量图像尺寸 - 如果它是 300 dpi 或更高,请考虑根据图像的位深度将图像重新采样为更小的尺寸 - 例如,您可以 可能从 300 dpi 灰色或 rgb 变为 200 dpi,并且不会丢失太多细节。
  • 如果您有真正彩色的 rgb 图像,请考虑对其进行调色。
  • 检查图像的内容,看看是否可以帮助提高图像的可压缩性。例如,如果您遍历彩色/灰色图像并细化大量聚集的颜色,请考虑对它们进行平滑处理。如果它是灰色或黑白相间的并且包含许多 Blob ,请考虑去除 Blob 。
  • 明智地选择最终压缩。 JPEG2000 可以比 JPEG 做得更好。 JBIG2 比 G4 做得好得多。 Flate 可能是最好的灰色非破坏性压缩。 JPEG2000 和 JBIG2 的大多数实现不是免费的。
  • 如果您是摇滚明星,您想尝试分割图像并将其分成真正黑白和真正彩色的区域。

也就是说,如果您确实能够以无人监督的方式做好所有这些工作,那么您就拥有了自己的商业产品。

我会说您可以使用 Atalasoft dotImage 完成大部分工作(免责声明:它不是免费的;我在那里工作;我编写了几乎所有的 PDF 工具;我曾经在 Acrobat 上工作)。

使用 dotImage 的一种特殊方法是提取所有只有图像的页面,重新压缩它们并将它们保存到新的 PDF 中,然后通过从原始文档中获取所有页面并将它们替换为新的 PDF 来构建新的 PDF重新压缩页面,然后再次保存。没那么难。

List<int> pagesToReplace = new List<int>();
PdfImageCollection pagesToEncode = new PdfImageCollection();

using (Document doc = new Document(sourceStream, password)) {

for (int i=0; i < doc.Pages.Count; i++) {
Page page = doc.Pages[i];
if (page.SingleImageOnly) {
pagesToReplace.Add(i);
// a PDF image encapsulates an image an compression parameters
PdfImage image = ProcessImage(sourceStream, doc, page, i);
pagesToEncode.Add(i);
}
}

PdfEncoder encoder = new PdfEncoder();
encoder.Save(tempOutStream, pagesToEncode, null); // re-encoded pages
tempOutStream.Seek(0, SeekOrigin.Begin);

sourceStream.Seek(0, SeekOrigin.Begin);
PdfDocument finalDoc = new PdfDocument(sourceStream, password);
PdfDocument replacementPages = new PdfDocument(tempOutStream);

for (int i=0; i < pagesToReplace.Count; i++) {
finalDoc.Pages[pagesToReplace[i]] = replacementPages.Pages[i];
}

finalDoc.Save(finalOutputStream);

这里缺少的是 ProcessImage()。 ProcessImage 将光栅化页面(您无需了解图像可能已缩放为 PDF)或提取图像(并跟踪图像上的变换矩阵),然后完成上面列出的步骤。这很重要,但它是可行的。

关于c# - 使用免费软件库使用 C# 编程压缩现有 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13719553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com