Это можно сделать с помощью DotImage DotPdf от Atalasoft (см. Обязательное «Я работаю там и работаю над этими продуктами»).Вот как я мог бы выполнить эту задачу в C #:
PdfImageSource source = new PdfImageSource(pdfStream);
while (source.HasMoreImages()) {
AtalaImage image = source.AcquireNext();
string fileName = GetNextTiffName();
using (FileStream outStm = new FileStream(fileName, FileMode.Create)) {
TiffEncoder encoder = new TiffEncoder();
encoder.Compression = SelectCompression(image.PixelFormat);
image.Save(outStm, encoder, null);
}
source.Release(image);
}
private TiffCompression SelectCompression(PixelFormat pf)
{
switch (pf) {
// 1 bit? use CCITT G4
case PixelFormat.Pixel1bbIndexed: return TiffCompression.Group4FaxEncoding;
// 24 bit? use JPEG
case PixelFormat.Pixel24bppBgr: return TiffCompression.JpegCompression;
// all else, Lzw
default: return TiffCompression.Lzw;
}
}
Вы можете заставить SelectCompression делать практически все, что вы хотите.Если вы выберете недопустимое сжатие для этого пиксельного формата, кодировщик будет использовать вместо него подходящий без потерь (например, если вы выберете CCITT для 24-битного цвета, кодировщик вместо этого будет использовать Lzw).
Наш PDFдекодер знает, когда PDF-страница просто серая, и возвращает серое изображение.Он НЕ делает ничего, чтобы получить 1 бит (это так сглаженный текст выглядит хорошо), однако вы можете пороговое изображение серого и посмотреть на общие различия между ним и серым изображением, чтобы определить, может ли оно перейти на 1 бит).
Вот как вы можете сделать набор страниц:
public void ExtractNPages(Stream pdfStream, params int[] pageIndexes)
{
PdfImageSource source = new PdfImageSource(pdfStream);
for (int i in pageIndexes) {
AtalaImage image = source[i]; // implied Acquire
string fileName = GetNextTiffName();
using (FileStream outStm = new FileStream(fileName, FileMode.Create)) {
TiffEncoder = new TiffEncoder();
encoder.Compression = SelectCompression(image.PixelFormat);
image.Save(outStm, encoder, null);
}
source.Release(image);
}
}
, так что теперь вы можете просто сделать ExtractNPages(stm, 0, 2, 4, 6);