powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# сжать размер PDF файла
13 сообщений из 13, страница 1 из 1
c# сжать размер PDF файла
    #39444404
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Нужна помощь!

Мне нужно pdf файл состоящий из сканированных копий, уменьшить его вес. Поискав в интернете, а нашел несколько вариантов, но они платные. Поэтому пошел по пути PdfSharpe и MigraDoc.

Моя логика решения данного вопроса:
1. Создаю пустой pdf документ
2. Открываю скан pdf документ, из которого я буду брать страницы PdfPage
3. Каждую страницу я буду переводить в Bitmap при помощи XGraphics ( http://stackoverflow.com/questions/2995984/how-to-export-pdf-page-as-an-image-using-pdfsharp-net-library)
4. После ужимать Bitmap ( http://stackoverflow.com/questions/3034167/bitmap-compression)
5. Далее полученный результат сохранять в пустой pdf документ.

Вопрос, ужмется ли документ при такой логике? Или есть более эффективное решение?
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39444431
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там же jpegi пожатые внутрях, смысл в bitmap гнать. Разве что их выковыривать, уменьшать dpi и качество.
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39444450
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PallarisТам же jpegi пожатые внутрях, смысл в bitmap гнать. Разве что их выковыривать, уменьшать dpi и качество.
Вот наткнулся на библиотеку itextsharp. Она вроде как умеет делать операцию сжатия.
Нужно проверить.
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39444644
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам подумай, вот ты сжал файл 1.pdf в файл 2.pdf. И теперь пытаешься сжать файл 2.pdf. Он сожмётся?
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39444789
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13thСам подумай, вот ты сжал файл 1.pdf в файл 2.pdf. И теперь пытаешься сжать файл 2.pdf. Он сожмётся?
Не могу поймать хот вашей мысли. Возможно вы не вникли в вопрос полностью.
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39444875
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

Сканы цветные, градации серого, монохромные?
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39445228
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoВопрос, ужмется ли документ при такой логике?если исходный pdf это скан, то нет (а если текст, то тем более). в нем уже хранится ужатое изображение. при "переводе в bitmap" оно разжимается в реальный размер, и ужав его, вернешься к размеру исходного pdf.

ужать можно только уменьшив разрешение и качество jpeg, как уже написали.
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39447730
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел вариант через itextsharp. Итог сжатие есть, но настолько незначительное. В общем буду пробовать через уменьшения качества изображения.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var files = new[] { @"C:\VBA\1000291811", @"C:\VBA\1000291812" };
foreach (var file in files)
{
    var reader = new PdfReader(file + ".pdf");
    var stamper = new PdfStamper(reader, new FileStream(file + "_compress.pdf", FileMode.Create), PdfWriter.VERSION_1_7);
    var pageNum = reader.NumberOfPages;
    for (var i = 1; i <= pageNum; i++)
    {           
        reader.SetPageContent(i, reader.GetPageContent(i), PdfStream.BEST_COMPRESSION, true);
    } 
    stamper.FormFlattening = true;
    stamper.SetFullCompression();
    stamper.Close();
}
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39447775
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для чего нужно сжатие?
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39448715
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь получить сканированное изображения со страницы файла pdf. Но выдает ошибку

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
var files = new[] { @"C:\Temp\111.pdf", @"C:\Temp\222.pdf" };
foreach (var file in files)
{
    var pdfReader = PdfReader.Open(file);

    // Первый вариант
    foreach (PdfPage page in pdfReader.Pages)
    {
        var resources = page.Elements.GetDictionary("/Resources");
        if (resources != null)
        {
            var xObjects = resources.Elements.GetDictionary("/XObject");
            if (xObjects != null)
            {
                var items = xObjects.Elements.Values;
                foreach (PdfItem item in items)
                {
                    var reference = item as PdfReference;
                    if (reference != null)
                    {
                        var xObject = reference.Value as PdfDictionary;
                        if (xObject != null && xObject.Elements.GetString("/Subtype") == "/Image")
                        {
                            var memoryImage = new MemoryStream(xObject.Stream.Value);
                            var imageStriam = Image.FromStream(memoryImage); //Error is valid parametr 
                        }
                    }
                }
            }
        }
    }
}
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39449368
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут примеры обработки изображений в pdf с помощью itextsharp
http://techqa.info/programming/question/8740244/pdf-compression-with-itextsharp

Сам занимался подобным, только на java. Использовал iText. Код примерно как в ответе kuujinbo. Только дополнительно ещё приводил к нужному размеру картинку, если она превышала допустимый и переводил в оттенки серого.
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39449384
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А просто сжатие PDF не даст результата в тех файлах, которые содержат одни картинки, поэтому нужно сжать именно картинки (сделать компрессию, уменьшить разрешение).
...
Рейтинг: 0 / 0
c# сжать размер PDF файла
    #39449392
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел свою заготовку
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
private ImageCodecInfo GetEncoder(ImageFormat format)
		{

			ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

			foreach (ImageCodecInfo codec in codecs)
			{
				if (codec.FormatID == format.Guid)
				{
					return codec;
				}
			}
			return null;
		}

		private void CompressPdf(string InFile, string OutFile)
		{
			PdfReader reader = new PdfReader(InFile);
			using (FileStream fs = new FileStream(OutFile, FileMode.Create))
			{

				int n = reader.XrefSize;
				PdfObject obj;
				PRStream stream;
				for (int i = 0; i < n; i++)
				{
					obj = reader.GetPdfObject(i);
					if (obj == null || !obj.IsStream()) continue;
					stream = (PRStream)obj;

					PdfObject pdfsubtype = stream.Get(PdfName.SUBTYPE);
					if (pdfsubtype != null && pdfsubtype.ToString().Equals(PdfName.IMAGE.ToString()))
					{


						byte[] steambytes = PdfReader.GetStreamBytesRaw(stream);
						Stream st = new MemoryStream(steambytes);

						Bitmap image = new Bitmap(st);
						ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);

						System.Drawing.Imaging.Encoder myEncoder =
							 System.Drawing.Imaging.Encoder.Quality;

						EncoderParameters myEncoderParameters = new EncoderParameters(1);

						EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 20L); //уровень сжатия
						myEncoderParameters.Param[0] = myEncoderParameter;
						byte[] buff;
						using (MemoryStream outst = new MemoryStream())
						{
							image.Save(outst, jpgEncoder, myEncoderParameters);
							outst.Position = 0;
							buff = outst.ToArray();
						}
						stream.SetData(buff, false, PRStream.BEST_COMPRESSION);
						stream.Put(PdfName.TYPE, PdfName.XOBJECT);
						stream.Put(PdfName.SUBTYPE, PdfName.IMAGE);
						stream.Put(PdfName.FILTER, PdfName.DCTDECODE);
						stream.Put(PdfName.WIDTH, new PdfNumber(image.Width));
						stream.Put(PdfName.HEIGHT, new PdfNumber(image.Height));
						stream.Put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
						stream.Put(PdfName.COLORSPACE, PdfName.DEVICERGB);
					}

				}
				reader.RemoveUnusedObjects();
				PdfStamper stamper = new PdfStamper(reader, fs);
				stamper.SetFullCompression();
				stamper.Close();
			}
			reader.Close();
		}


Пример сжатия взято с msdn https://msdn.microsoft.com/ru-ru/library/bb882583(v=vs.110).aspx?f=255&MSPPError=-2147217396
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# сжать размер PDF файла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]