Старый вопрос, я знаю, но я действительно нашел несколько приличное решение для этого.У меня тоже были проблемы с извлечением изображений из PDF-файлов с кодировкой JBig2.Более новые версии (пост 4.1.6) iTextSharp фактически поддерживают его, но эти версии теперь находятся под лицензией AGPL.
Использование JPEdal версии 1 этой библиотеки этой библиотеки (версия 2 небесплатно), вы можете конвертировать изображения в кодировке JBig2 в System.Drawing.Bitmap
и сохранять их / изменять их по своему усмотрению Однако , эта библиотека будет только декодировать данные, она не сможет кодировать изображение в формат JBig2.
НебольшаяНо очень незначительно то, что библиотека находится на Java.Это совсем не проблема для пользователя C #, благодаря IKVM .IKVM, если вы еще не знали об этом, имеет полную виртуальную машину Java, которая работает в .NET и имеет собственные реализации .NET библиотек классов Java.Его очень легко настроить, и я буквально только что проверил все это около 2 часов назад.
После того, как вы скачали IKVM и JBig2 jar по вышеуказанной ссылке, вы можете выполнить эту команду, чтобы получить IKVM конвертируйте банку в нативную DLL-библиотеку .NET.
ikvmc -target: library [путь к jbig2.jar]
, которая выведет .NETdll с именем jbig2.dll
находится в том же каталоге исполняемого файла jar или ikvmc (который не помню, какой).Затем укажите в своем проекте ссылки jbig2.dll
, IKVM.OpenJDK.Core
, IKVM.OpenJDK.Media
, IKVM.OpenJDK.SwingAWT
и IKVM.Runtime
.Для извлечения изображения я использовал код, подобный следующему:
// code to iterate over PDF objects and get bytes of a valid image elided
var imageBytes = GetRawImageBytesFromPdf();
if (filterType.Equals(PdfName.JBIG2DECODE))
{
var jbg2 = new JBIG2Decoder();
// Some JBig2 will extract without setting the JBig2Globals
var decodeParams = stream.GetAsDict(PdfName.DECODEPARMS);
if(decodeParams != null)
{
var globalRef = decodeParams.GetAsIndirectObject(
PdfName.JBIG2GLOBALS);
if(globalRef != null)
{
var globals = PdfReader.GetPdfObject(globalRef);
var globalStream = globals as PRStream;
var globalBytes = PdfReader.GetStreamBytesRaw(globalStream);
if (globalBytes != null)
{
jbg2.setGlobalData(globalBytes);
}
}
}
jbg2.decodeJBIG2(imageBytes);
var pages = jbg2.getNumberOfPages();
for(int p = 0; p < pages; p++)
{
java.awt.image.BufferedImage bufImg = jbg2.getPageAsBufferedImage(p);
var bitmap = bufImg.getBitmap();
bitmap.Save(@"c:\path\to\file.tif", ImageFormat.Tiff);
// note: I am unsure about the need to free the memory of the internal
// bitmap used in the BufferedImage class. The docs for IKVM and
// that class should probably be consulted to find out if that
// should be done.
}
}
// handle other formats like CCITTFAXDECODE
Он хорошо работает, хотя библиотека не самая быстрая (это не связано с тем, что она используется в IKVM,разработчики признают, что версия 1 этой библиотеки неэффективна).Я не влюблён в написание / редактирование Java-кода, поэтому, если бы я сам захотел улучшить скорость, я решил, что, вероятно, просто потрудился бы напрямую перенести его на C # -код.Однако в этом проекте github есть еще одна ветвь этого java-кода , требующая увеличения скорости в 2,5-4,5 раза.Возможно, вы могли бы скомпилировать этот jar-файл и использовать с ним ikvmc.
Надеюсь, это поможет любому, кто все еще ищет решение этой проблемы!