Machen Sie eine pdf-konforme PDF/A mit nur Bilder mit iTextSharp
Verwende ich iTextSharp generieren Sie pdf-Dokumente aus Bildern. Ich habe bisher nicht erfolgreich gewesen.
Edit: ich bin mit iTextSharp zum generieren der PDF -
Alle ich versuche zu machen, ist ein pdf-Dokument (1a oder 1b, was auch immer passt), mit einigen Bildern. Dies ist der code, den ich habe, so weit, aber ich erhalte Fehler, wenn ich versuche, Sie zu bestätigen mit pdf-tools oder validatepdfa.
Dies sind die Fehler, die ich bekommen aus pdf-tools (mit PDF/A-1b-Validierung):
Edit: MarkInfo-und Farbraum arn noch nicht arbeiten. Der rest ist okay
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.
Main flow
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 prepareImage()
Es ist verwendet, um reduzieren Sie das Bild im bmp -, so brauche ich mich nicht zu belästigen, über 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, in eine Richtung, um den Fehler zu beheben?
Speziell die device-specific color spaces
Edit: Weitere Erläuterung: Was ich versuche zu erreichen ist, zum konvertieren gescannter Bilder in PDF/A für Langzeitarchivierung
Edit: Hinzugefügt einige Dateien, die ich zum test mit
PDF-Dateien und Pictures.rar (3.9 MB)
https://mega.co.nz/#!n8pClYgL!NJOJqSO3EuVrqLVyh3c43yW-u_U35NqeB0svc6giaSQ
- Es könnte sich lohnen, heben einen Fehler mit der iText Menschen.
- Warum setzen Sie sich conformance level PDF/A-1a und überprüfen Sie dann gegen die 1b? Es wäre gut, konsequent zu sein. Auch, warum öffnen Sie das Dokument zweimal? Außerdem würde ich versuchen, zu beheben der anderen Fehler zuerst den Fehler haben Sie mit Datei-Struktur beschädigt werden, und so weiter, könnte leicht stören das (kleinere) problem, das man mit Farbe Räume...
- Okay, vielen Dank für Ihre Antwort. Aber ich habe schon fast alles richtig jetzt arbeiten. Nur die
color space
ist nicht korrekt. Ich habe einige änderungen an dem code. - Was ist der Farbraum des Bildes, das Sie einfügen? Und kannst du uns ein Beispiel-PDF? So konnte ich führen Sie es durch die pdfToolbox-PDF/A-Prüfung, und vielleicht noch eine aussagekräftigere Fehlermeldung.
- Was wir versuchen zu tun ist, konvertieren Sie gescannte Bilder in PDF/A für Langzeitarchivierung. Ich habe hochgeladen ein zip mit den Dateien, die ich für Tests: PDF-Dateien und Pictures.rar (3.9 MB) mega.co.nz/...
- Haben Sie versucht, mit dem PdfAWriter? Seit dem letzten Sommer die PDF/A-spezifischen Funktionen wurden verschoben in getrennten Klassen. In Java Sie haben sogar schon in einem separaten Gefäß, vielleicht ist es das gleiche mit iTextSharp?
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, ich habe eine Ihrer Dateien in der callas pdfToolbox und er sagt: "Device-Farbraum verwendet aber kein PDF/A-output intent". Das nahm ich als Zeichen, dass Sie etwas Falsches tun, während Sie schreiben ein output-intent des Dokuments. Ich habe dann konvertiert das Dokument in das PDF/A-1b mit dem gleichen Werkzeug und der Unterschied ist offensichtlich.
Vielleicht gibt es andere Fehler, die Sie beheben müssen, aber der erste Fehler hier ist, dass Sie einen Schlüssel in der Katalog-dict für die PDF-Datei mit dem Namen "OutputIntent". Das ist falsch: Seite 75 der PDF-Spezifikation besagt, dass der Schlüssel mit dem Namen "OutputIntents".
Wie gesagt, vielleicht gibt es andere Probleme mit Ihrer Datei haben darüber hinaus aber den falschen Namen für den Schlüssel bewirkt, dass PDF/A-Validatoren nicht zu finden, der Ausgabe-intention Sie versuchen die Datei...
PdfWriter.SetOutputIntents
statt, die richtigen Namen verwendet worden wären... Wenn er benutzt hattePdfAWriter
stattPdfWriter
einige mehr Sachen, die würde automatisch erledigt.Zunächst pdfx IST NICHT pdfa.
Ich habe keine Lösung für image-problem leider, aber ich habe für 1 und 2.
Hinsichtlich