2013-04-09 43 views
8

Tôi đang sử dụng iTextSharp để tạo tài liệu pdf từ hình ảnh. Cho đến nay tôi đã không thành công.
Chỉnh sửa: Tôi đang sử dụng iTextSharp để tạo ra PDFTạo pdf phù hợp PDF/A chỉ với hình ảnh bằng cách sử dụng iTextSharp

Tất cả tôi cố gắng là để thực hiện một pdf-một tài liệu (1a hoặc 1b, bất cứ điều gì phù hợp), với một số hình ảnh. Đây là mã tôi đã đưa ra cho đến nay, nhưng tôi tiếp tục nhận được lỗi khi tôi cố gắng xác nhận chúng với pdf-tools hoặc validatepdfa.

Đây là lỗi tôi nhận được từ các công cụ pdf (sử dụng xác thực PDF/A-1b): Chỉnh sửa: MarkInfo và không gian màu chưa hoạt động. Phần còn lại là ổn

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. 

dòng chảy chính

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

Đây là prepareImage()
Nó được sử dụng để làm phẳng các hình ảnh sang bmp, vì vậy tôi không cần phải bận tâm về kênh 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; 
} 

Bất kỳ ai cũng có thể giúp tôi sửa chữa lỗi không? Cụ thể device-specific color spaces

Edit: Nhiều giải thích: Những gì tôi đang cố gắng để đạt được là, chuyển đổi hình ảnh quét sang PDF/A để lưu trữ dữ liệu lâu dài-

Edit: thêm vào một số tác phẩm tôi sử dụng để thử nghiệm với
PDF và Pictures.rar (3.9 MB)
https://mega.co.nz/#!n8pClYgL!NJOJqSO3EuVrqLVyh3c43yW-u_U35NqeB0svc6giaSQ

+0

Nó có thể là giá trị nâng cao một lỗi với những người iText. – Rup

+0

Tại sao bạn đặt mức độ phù hợp thành PDF/A-1a và sau đó kiểm tra với 1b? Nó sẽ là tốt để được nhất quán. Ngoài ra, tại sao bạn mở tài liệu hai lần? Ngoài ra, tôi sẽ cố gắng giải quyết các lỗi khác trước tiên - các lỗi bạn có với cấu trúc tệp bị hỏng và vân vân, có thể dễ dàng can thiệp vào vấn đề (nhỏ hơn) mà bạn có với không gian màu ... –

+0

@David Được rồi, cảm ơn vì Đáp lại. Mặc dù tôi đã có gần như tất cả mọi thứ một cách chính xác làm việc ngay bây giờ. Chỉ có 'không gian màu' là không chính xác. Tôi đã thêm một số chỉnh sửa vào mã. – Highmastdon

Trả lời

1

OK, tôi đã kiểm tra một trong những tập tin của bạn trong Callas pdfToolbox và nó nói: "không gian màu thiết bị được sử dụng nhưng không có PDF/Một ý định đầu ra ". Mà tôi đã làm như một dấu hiệu cho thấy bạn làm điều gì đó sai trái trong khi viết một ý định đầu ra cho tài liệu. Sau đó tôi chuyển đổi tài liệu đó thành PDF/A-1b với cùng một công cụ và sự khác biệt là hiển nhiên.

Có thể có các lỗi khác bạn cần khắc phục, nhưng lỗi đầu tiên ở đây là bạn đặt khóa trong danh mục cho tệp PDF có tên "OutputIntent". Điều đó sai: trang 75 của Đặc tả PDF chỉ ra rằng khóa phải được đặt tên là "OutputIntents".

Như tôi đã nói, có lẽ có những vấn đề khác với tập tin của bạn vượt qua điều này, nhưng sai tên cho phím gây PDF/A không xác nhận để tìm tiếp cận mục đích Output bạn cố gắng để đưa vào tập tin ...

+0

+1; nếu @Highmastdon đã sử dụng phương thức 'PdfWriter.SetOutputIntents' thay vào đó, tên chính xác sẽ được sử dụng ... Nếu anh ta đã sử dụng' PdfAWriter' thay vì 'PdfWriter', một số thứ khác sẽ tự động được xử lý. – mkl

0
  1. Trước hết, pdfx KHÔNG phải là pdfa.

    1. Thứ hai, bạn đang sử dụng sai PdfWriter. Nó phải là PdfAWriter.

Tôi không có giải pháp cho vấn đề hình ảnh unfortunatelly, nhưng tôi có cho 1 và 2.

Trân

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

    } 


} 
Các vấn đề liên quan