2013-04-09 3 views
8

Я использую 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

+0

Может быть стоит повышение глюк с людьми IText. – Rup

+0

Почему вы устанавливаете уровень соответствия PDF/A-1a и затем проверяете 1b? Было бы хорошо быть последовательным. Кроме того, почему вы дважды открываете документ? Кроме того, я попытался бы разрешить другие ошибки сначала - ошибки, которые у вас есть с поврежденной файловой структурой и т. Д., Могут легко помешать (меньшей) проблеме с цветовыми пространствами ... –

+0

@ David Хорошо, спасибо за ваше Ответить. Хотя сейчас у меня уже почти все правильно работает. Только цветовое пространство неверно. Я добавил некоторые изменения в код. – Highmastdon

ответ

1

ОК, я проверил один из файлов в Каллас pdfToolbox, и он говорит: «используется цвет устройства пространство, но не PDF/Цель вывода ". Который я принял как знак того, что вы делаете что-то не так, когда пишете вывод документа в документ. Затем я преобразовал этот документ в PDF/A-1b с помощью одного и того же инструмента, и разница очевидна.

Возможно, есть другие ошибки, которые необходимо исправить, но первая ошибка заключается в том, что вы помещаете ключ в каталог dict для файла PDF с именем «OutputIntent». Это неправильно: на стр. 75 спецификации PDF указано, что ключ должен быть назван «OutputIntents».

Как я уже сказал, возможно, есть и другие проблемы, связанные с вашим файлом за это, но неправильное имя для ключа вызывает PDF/A валидаторы не найти выхода Intent вы пытаетесь поместить в файл ...

+0

+1; если @Highmastdon использовал метод 'PdfWriter.SetOutputIntents' вместо этого, правильное имя было бы использовано ... Если бы он использовал' PdfAWriter', а не 'PdfWriter', то некоторые дополнительные вещи были бы автоматически приняты во внимание. – mkl

0
  1. Прежде всего, pdfx НЕ ПДФА.

    1. Во-вторых, вы используете неправильный PdfWriter. Это должен быть PdfAWriter.

Я не решение проблемы с имиджем сожалению, но у меня есть для 1 и 2.

С уважением

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(); 
     } 

    } 


} 
Смежные вопросы