Я использую iTextSharp для создания pdf-документов из изображений. До сих пор я не был успешным.
Edit: Я использую iTextSharp для создания формата PDFСделайте pdf-файл, совместимый с PDF, используя только iTextSharp
Все, что я пытаюсь это сделать PDF-документ (1a или 1b, независимо от масти), с некоторыми изображениями. Это код, который я придумал до сих пор, но я продолжаю получать ошибки, когда я пытаюсь их проверить с помощью pdf-tools или validatepdfa.
Это ошибки, которые я получаю из pdf-инструментов (с использованием проверки PDF/A-1b): Редактировать: MarkInfo и цветовое пространство еще не работают. Остальное хорошо
Validating file "0.pdf" for conformance level pdfa-1a
The key MarkInfo is required but missing.
A device-specific color space (DeviceRGB) without an appropriate output intent is used.
The document does not conform to the requested standard.
The document contains device-specific color spaces.
The document doesn't provide appropriate logical structure information.
Done.
Основной поток
var output = new MemoryStream();
using (var iccProfileStream = new FileStream("ToPdfConverter/ColorProfiles/sRGB_v4_ICC_preference_displayclass.icc", FileMode.Open))
{
var document = new Document(new Rectangle(PageSize.A4.Width, PageSize.A4.Height), 0f, 0f, 0f, 0f);
var pdfWriter = PdfWriter.GetInstance(document, output);
pdfWriter.PDFXConformance = PdfWriter.PDFA1A;
document.Open();
var pdfDictionary = new PdfDictionary(PdfName.OUTPUTINTENT);
pdfDictionary.Put(PdfName.OUTPUTCONDITION, new PdfString("sRGB IEC61966-2.1"));
pdfDictionary.Put(PdfName.INFO, new PdfString("sRGB IEC61966-2.1"));
pdfDictionary.Put(PdfName.S, PdfName.GTS_PDFA1);
var iccProfile = ICC_Profile.GetInstance(iccProfileStream);
var pdfIccBased = new PdfICCBased(iccProfile);
pdfIccBased.Remove(PdfName.ALTERNATE);
pdfDictionary.Put(PdfName.DESTOUTPUTPROFILE, pdfWriter.AddToBody(pdfIccBased).IndirectReference);
pdfWriter.ExtraCatalog.Put(PdfName.OUTPUTINTENT, new PdfArray(pdfDictionary));
var image = PrepareImage(imageBytes);
document.Open();
document.Add(image);
pdfWriter.CreateXmpMetadata();
pdfWriter.CloseStream = false;
document.Close();
}
return output.GetBuffer();
Это prepareImage()
Используется для выравнивания изображения в формате BMP, так что мне не нужно беспокоиться о альфа-каналов.
private Image PrepareImage(Stream stream)
{
Bitmap bmp = new Bitmap(System.Drawing.Image.FromStream(stream));
var file = new MemoryStream();
bmp.Save(file, ImageFormat.Bmp);
var image = Image.GetInstance(file.GetBuffer());
if (image.Height > PageSize.A4.Height || image.Width > PageSize.A4.Width)
{
image.ScaleToFit(PageSize.A4.Width, PageSize.A4.Height);
}
return image;
}
Может ли кто-нибудь помочь мне в решении исправить ошибки? конкретно device-specific color spaces
Edit: Больше объяснения: То, что я пытаюсь достичь, преобразования отсканированных изображений в PDF/A для долгосрочного хранения данных
Edit: добавлены некоторые файлы я в используя для тестирования с
PDF-файлов и Pictures.rar (3,9 MB)
https://mega.co.nz/#!n8pClYgL!NJOJqSO3EuVrqLVyh3c43yW-u_U35NqeB0svc6giaSQ
Может быть стоит повышение глюк с людьми IText. – Rup
Почему вы устанавливаете уровень соответствия PDF/A-1a и затем проверяете 1b? Было бы хорошо быть последовательным. Кроме того, почему вы дважды открываете документ? Кроме того, я попытался бы разрешить другие ошибки сначала - ошибки, которые у вас есть с поврежденной файловой структурой и т. Д., Могут легко помешать (меньшей) проблеме с цветовыми пространствами ... –
@ David Хорошо, спасибо за ваше Ответить. Хотя сейчас у меня уже почти все правильно работает. Только цветовое пространство неверно. Я добавил некоторые изменения в код. – Highmastdon