2017-05-15 51 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

非常感谢布鲁诺!是为了一个大学项目! –