2017-05-15 87 views
0

我試圖生成PDF/A 1A,2A或3A與iText的爲C#,但我遇到這樣的問題:備用說明需要的圖文檔

「替代項應該指定/圖元素的替代描述。「

我的代碼如下所示:

public byte[] GeneratePDFA(byte[] inputPdf) 
{ 
    //System.out.println("PDF to PDF/A"); 
    // step 1: creation of a document-object 
    iTextSharp.text.Document document = new iTextSharp.text.Document(); 
    PdfReader reader = null; 
    MemoryStream ms = new MemoryStream(); 
    try 
    { 
     // step 2: 
     // we create a writer that listens to the document 
     // and directs a PDF-stream to a file 
     PdfAWriter writer = PdfAWriter.GetInstance(document, ms, PdfAConformanceLevel.PDF_A_1A); 
     writer.SetTagged(PdfWriter.markAll); 
     document.AddAuthor("DiY"); 
     document.AddSubject("DiY"); 
     document.AddLanguage("it-IT"); 
     document.AddCreationDate(); 
     writer.CreateXmpMetadata(); 
     //writer.setCompressionLevel(9); 
     // step 3: we open the document 
     document.Open(); 
     PdfContentByte cb = writer.DirectContent; // Holds the PDF data 
     // step 4: 
     reader = new PdfReader(inputPdf); 
     PdfTemplate page; 
     // Get number of pages: 
     int pageCount = reader.NumberOfPages; 
     for (int i = 0; i < pageCount; i++) 
     { 
      document.NewPage(); 
      page = writer.GetImportedPage(reader, i + 1); 
      cb.AddTemplate(page, 0d, 0d); 
     } 
    } 
    catch (DocumentException de) 
    { 
     throw de; 
    } 
    catch (IOException ioe) 
    { 
     throw ioe; 
    } 
    // step 5: we close the document 
    document.Close(); 
    reader.Close(); 
    document.Dispose(); 
    reader.Dispose(); 
    ms.Flush(); 
    return ms.GetBuffer(); 
} 

PS:如果我嘗試生成一個PDF/A B1,B2或B3它工作得很好,但我需要生成一個級別的文件!

回答

1

B表示Basic;這意味着您要確保長期保留文檔的可視化表示。 A表示無障礙;這意味着您的文檔需要包含有關其內容的語義信息。這也意味着您添加的每張圖片都需要進行說明。

看看官方的FAQ,更具體的問題有關創建可訪問PDF:How can I generate a PDF/UA compatible PDF with iText?

我們在這個例子中添加Alt描述的圖像Chunk

Image i = Image.getInstance(FOX); 
CHunk c = new Chunk(i, 0, -24); 
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox")); 

你是以非常尷尬的方式創建您的文檔。您將可能無法訪問的頁面導入到應該可訪問的文檔中。那是永遠不會工作!

如果原始PDF被加了標記,那麼通過複製頁面而不復制結構樹,您將丟棄所有預先存在的語義信息。如果您的問題是您需要爲圖片添加替代文字,您應該閱讀以下問題:Add alternative text for an image in tagged pdf (PDF/UA) using iText

如果原始PDF未加標籤,您將欺騙您的客戶,因爲您只是複製內容頁面而不關心內容的語義。如果原始文檔包含表格,則應該創建一個結構樹根並將該表格標記爲這樣。即使不是不可能,這也是非常困難的。您可能需要一個人來檢測文檔的語義結構,並且人可能需要手動標記PDF。

想象一下無法訪問的PDF文件,其中包含狐狸和狗的圖片。在這種情況下,您需要添加該圖片的替代描述,例如說:「一隻快速的棕色狐狸跳過一隻懶狗。」

機器如何去做?更具體地說:機器如何「看到」圖像是狐狸跳過狗的圖像。

總結:無論多少次,你張貼了這個問題(見Add alternative text for an image in Tagged PDF in C#你已經刪除了可能是一些其他問題),你的問題是錯誤的!您不能簡單地拿出一個無法訪問的PDF,並將其倒入無需提供適當標籤即可訪問的PDF中。提供適當的標籤是需要人類智能的東西;沒有人的幫助,機器就無法做到。

你的持久性表示要用來驗證一個PDF作爲在技術層面上 PDF/A A級和,如果PDF上一個人的水平驗證你不在乎的解決方案。請注意,如果你這樣做,你可能會被起訴。在加拿大,罰款可高達10萬加元。懇求無知無助於你,因爲你有一位PDF專家解釋說,你對PDF轉換爲可訪問的PDF的假設是錯誤的。

+0

非常感謝布魯諾!是爲了一個大學項目! –