2013-04-09 109 views
8

我使用iTextSharp從圖像生成pdf文檔。到目前爲止,我還沒有成功。
編輯:我使用iTextSharp的生成PDF使用iTextSharp製作PDF格式的符合PDF/A的圖像

所有我嘗試是使的PDF文檔(1a或1b,無論套),具有一定的圖像。這是我到目前爲止的代碼,但當我嘗試使用pdf-toolsvalidatepdfa來驗證它們時,我總是收到錯誤。

這是我從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(); 

這是
它被用來壓平到bmp圖像的prepareImage(),所以我不需要操心alpha通道。

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

編輯:更多的解釋:我試圖實現是,將掃描的圖像以PDF/A用於長期數據存儲

編輯:增加了一些文件,我使用帶有
PDF和Pictures.rar(3.9 MB)
https://mega.co.nz/#!n8pClYgL!NJOJqSO3EuVrqLVyh3c43yW-u_U35NqeB0svc6giaSQ

+0

這可能是值得提高與iText的人的錯誤。 – Rup 2013-04-09 08:49:29

+0

爲什麼要將一致性級別設置爲PDF/A-1a,然後檢查1b?保持一致是件好事。另外,爲什麼要打開文檔兩次?此外,我會嘗試首先解決其他錯誤 - 你有文件結構損壞等錯誤,可以很容易地干擾(顏色空間)(小)問題... – 2013-04-09 08:57:34

+0

@大衛好吧,謝謝你的回覆。儘管我已經幾乎所有的東西都正確工作了。只有'色彩空間'是不正確的。我在代碼中添加了一些編輯。 – Highmastdon 2013-04-09 09:51:29

回答

1

OK測試,我檢查了卡拉斯pdfToolbox文件之一,它說:「使用的設備顏色空間,但沒有PDF /輸出意圖「。我將其作爲一個標誌,表示在向文檔寫入輸出意向時出現錯誤。然後我用相同的工具將該文件轉換爲PDF/A-1b,差別是顯而易見的。

也許還有其他錯誤需要修復,但這裏的第一個錯誤是您在名爲「OutputIntent」的PDF文件的目錄詞典中放置了一個鍵。這是錯誤的:PDF規範的第75頁指出,密鑰應該命名爲「OutputIntents」。

就像我說的,也許還有其他問題,您的文件超出了這一點,但是其中一個重要的錯誤的名稱會導致PDF/A驗證器找不到您嘗試將文件中的輸出意向...

+0

+1;如果@Highmastdon使用了「PdfWriter.SetOutputIntents」方法,則會使用正確的名稱......如果他使用了「PdfAWriter」而不是「PdfWriter」,則會自動處理更多內容。 – mkl 2013-04-10 07:39:18

0
  1. 首先,pdfx不是pdfa。

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

    } 


} 
相關問題