Ich benutze iTextSharp, um PDF-Dokumente aus Bildern zu generieren. Bisher war ich nicht erfolgreich.
Edit: Ich iTextSharp mit dem PDFErstellen Sie eine PDF-konforme PDF/A mit nur Bildern mit iTextSharp
Alles, was ich versuche zu generieren ein PDF-Dokument (1a oder 1b, unabhängig von Anzügen) zu machen, mit einigen Bildern. Dies ist der Code, den ich bisher gefunden habe, aber ich bekomme immer Fehler, wenn ich versuche, sie mit pdf-tools oder zu validieren.
Dies sind die Fehler, die ich von PDF-Tools bekomme (mit PDF/A-1b-Validierung): Edit: Markinfo und Color Space funktionieren noch nicht. Der Rest ist in Ordnung
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.
Hauptfluss
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();
Dies ist Preparelmage()
Es wird verwendet, um das Bild zu glätten bmp, so brauche ich nicht zu stören Alpha-Kanäle.
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;
}
Kann mir jemand helfen, die Fehler zu beheben? Insbesondere die device-specific color spaces
Edit: Weitere Erklärungen: Was ich versuche zu erreichen ist, gescannte Bilder in PDF/A für die Langzeitspeicherung Datenumwandlungs
Edit: hat einige Dateien Ich bin zu testen, mit
PDFs und Pictures.rar (3,9 MB) mit
https://mega.co.nz/#!n8pClYgL!NJOJqSO3EuVrqLVyh3c43yW-u_U35NqeB0svc6giaSQ
Es könnte einen Fehler mit den iText Anhebung Menschen wert sein. – Rup
Warum setzen Sie das Konformitätsniveau auf PDF/A-1a und überprüfen Sie dann gegen 1b? Es wäre gut, konsequent zu sein. Warum öffnen Sie das Dokument auch zweimal? Ich würde auch versuchen, die anderen Fehler zuerst aufzulösen - die Fehler, die Sie mit der Dateistruktur haben, die usw. korrumpiert wird, könnte leicht mit dem (kleineren) Problem stören, das Sie mit Farbräumen haben ... –
@David Okay, danke für Ihr Antworten. Obwohl ich jetzt schon fast alles richtig funktioniere. Nur der 'Farbraum' ist nicht korrekt. Ich habe dem Code einige Änderungen hinzugefügt. – Highmastdon