2013-04-09 10 views
8

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

+0

Es könnte einen Fehler mit den iText Anhebung Menschen wert sein. – Rup

+0

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 ... –

+0

@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

Antwort

1

OK, überprüfte ich eine Ihrer Dateien in callas pdfToolbox und es sagt: „Gerätefarbraum verwendet, aber kein PDF/Eine Ausgabeabsicht ". Was ich als ein Zeichen nahm, dass Sie etwas falsch machen, während Sie eine Ausgabebedingung in das Dokument schreiben. Ich habe dann dieses Dokument mit demselben Werkzeug in PDF/A-1b umgewandelt 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 das Katalogdict für die PDF-Datei mit dem Namen "OutputIntent" setzen. Das ist falsch: Seite 75 der PDF-Spezifikation besagt, dass der Schlüssel "OutputIntents" heißen sollte.

Wie gesagt, vielleicht gibt es andere Probleme mit Ihrer Datei darüber hinaus, aber der falsche Name für den Schlüssel verursacht PDF/A-Validierer nicht den Output Intent Sie in der Datei zu setzen versuchen, zu finden ...

+0

+1; Wenn @Highmastdon stattdessen die Methode 'PdfWriter.SetOutputIntents' verwendet hätte, wäre der korrekte Name verwendet worden ... Wenn er' PdfAWriter' anstelle von 'PdfWriter' verwendet hätte, wäre automatisch etwas mehr erledigt worden. – mkl

0
  1. Zunächst ist pdfx nicht pdfa.

    1. Zweitens verwenden Sie falschen PdfWriter. Es sollte PdfAWriter sein.

Ich habe keine Lösung für die Image-Problem leider nicht, aber ich habe für 1 und 2.

Grüße

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Text; 
using System.IO; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 
using iTextSharp.text.html.simpleparser; 
using iTextSharp.tool.xml; 
using System.Drawing; 
using System.Drawing.Imaging; 

namespace Tests 
{ 
    /* 
    * References: 
    * UTF-8 encoding http://stackoverflow.com/questions/4902033/itextsharp-5-polish-character 
    * PDFA http://www.codeproject.com/Questions/661704/Create-pdf-A-using-itextsharp 
    * Images http://stackoverflow.com/questions/15896581/make-a-pdf-conforming-pdf-a-with-only-images-using-itextsharp 
    */ 

    [TestClass] 
    public class UnitTest1 
    { 
     /* 
     * IMPORTANT: Restrictions with html usage of tags and attributes 
     * 1. Dont use * <head> <title>Sklep</title> </head>, because title is rendered to the page 
     */ 

     // Test cases 
     static string contents = "<html><body style=\"font-family:arial unicode ms;font-size: 8px;\"><p style=\"text-align: center;\"> Davčna številka dolžnika: 74605968<br /> </p><table> <tr> <td><b>\u0160t. sklepa: 88711501</b></td> <td style=\"text-align: right;\">Davčna številka dolžnika: 74605968</td> </tr> </table> <br/><img src=\"http://img.rtvslo.si/_static/images/rtvslo_mmc_logo.png\" /></body></html>"; 
     //static string contents = "<html><body style=\"font-family:arial unicode ms;font-size: 8px;\"><p style=\"text-align: center;\"> Davčna številka dolžnika: 74605968<br /> </p><table> <tr> <td><b>\u0160t. sklepa: 88711501</b></td> <td style=\"text-align: right;\">Davčna številka dolžnika: 74605968</td> </tr> </table> <br/></body></html>"; 

     //[TestMethod] 
     public void CreatePdfHtml() 
     { 
      createPDF(contents, true);   
     } 

     private void createPDF(string html, bool isPdfa) 
     { 
      TextReader reader = new StringReader(html); 
      Document document = new Document(PageSize.A4, 30, 30, 30, 30); 
      HTMLWorker worker = new HTMLWorker(document); 

      PdfWriter writer; 
      if (isPdfa) 
      { 
       //set conformity level 
       writer = PdfAWriter.GetInstance(document, new FileStream(@"c:\temp\testA.pdf", FileMode.Create), PdfAConformanceLevel.PDF_A_1B); 

       //set pdf version 
       writer.SetPdfVersion(PdfAWriter.PDF_VERSION_1_4); 

       // Create XMP metadata. It's a PDF/A requirement. 
       writer.CreateXmpMetadata(); 
      } 
      else 
      { 
       writer = PdfWriter.GetInstance(document, new FileStream(@"c:\temp\test.pdf", FileMode.Create)); 
      } 

      document.Open(); 

      if (isPdfa) // document should be opend, or it will fail 
      { 
       // Set output intent for uncalibrated color space. PDF/A requirement. 
       ICC_Profile icc = ICC_Profile.GetInstance(Environment.GetEnvironmentVariable("SystemRoot") + @"\System32\spool\drivers\color\sRGB Color Space Profile.icm"); 
       writer.SetOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc); 
      } 

      //register font used in html 
      FontFactory.Register(Environment.GetEnvironmentVariable("SystemRoot") + "\\Fonts\\ARIALUNI.TTF", "arial unicode ms"); 

      //adding custom style attributes to html specific tasks. Can be used instead of css 
      //this one is a must fopr display of utf8 language specific characters (čćžđpš) 
      iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet(); 
      ST.LoadTagStyle("body", "encoding", "Identity-H"); 
      worker.SetStyleSheet(ST); 

      worker.StartDocument(); 
      worker.Parse(reader); 
      worker.EndDocument(); 
      worker.Close(); 
      document.Close(); 
     } 

    } 


}