2016-08-16 12 views
0

Возможно ли использовать Apache PDFBox для обработки документов PDF/A-3? (Особенно для изменения значения полей?)Apache PDFBox и PDF/A-3

PDFBox 1.8 Cookbook говорит, что можно создавать PDF/A-1 документы с pdfaid.setPart(1);

  1. Могу ли я подать pdfaid.setPart(3) для PDF/A-3 документа?

  2. Если нет: возможно ли прочитать документ PDF/A-3, изменить некоторые значения полей и защитить его тем, что мне не нужно для> создания/преобразования в PDF/A-3 <, но документ все еще PDF/A-3?

+1

Вопрос был успешно отвечен (и очень красиво) в списке рассылки пользователей PDFBox. –

+0

Отлично, спасибо! Я привел этот ответ ниже. – hagem

ответ

2

PDFBox поддерживает это, но следует помнить, что в связи с тем, что PDFBox является библиотека низкого уровня, вы должны обеспечить соответствие себя не то есть нет «Сохранить как PDF/A-3». Вы можете взглянуть на http://www.mustangproject.org, который использует PDFBox для поддержки ZUGFeRD (электронного выставления счетов), который также нуждается в PDF/A-3.

1

Как создать PDF/A {2,3} - {B, U, A), действительный: в этом примере я конвертирую PDF в изображение, затем создаю действительный PDF/Ax-y с помощью образ. PDFBOX2.0x

public static void main(String[] args) throws IOException, TransformerException 
{ 

    String resultFile = "result/PDFA-x.PDF"; 
    FileInputStream in = new FileInputStream("src/PDFOrigin.PDF"); 

    PDDocument doc = new PDDocument(); 
    try 
    { 
     PDPage page = new PDPage(); 
     doc.addPage(page); 
     doc.setVersion(1.7f); 

     /*    
     // A PDF/A file needs to have the font embedded if the font is used for text rendering 
     // in rendering modes other than text rendering mode 3. 
     // 
     // This requirement includes the PDF standard fonts, so don't use their static PDFType1Font classes such as 
     // PDFType1Font.HELVETICA. 
     // 
     // As there are many different font licenses it is up to the developer to check if the license terms for the 
     // font loaded allows embedding in the PDF. 

     String fontfile = "/org/apache/pdfbox/resources/ttf/ArialMT.ttf"; 
     PDFont font = PDType0Font.load(doc, new File(fontfile));   
     if (!font.isEmbedded()) 
     { 
      throw new IllegalStateException("PDF/A compliance requires that all fonts used for" 
        + " text rendering in rendering modes other than rendering mode 3 are embedded."); 
     } 
     */ 

     PDPageContentStream contents = new PDPageContentStream(doc, page); 
     try 
     { 
      PDDocument docSource = PDDocument.load(in); 
      PDFRenderer pdfRenderer = new PDFRenderer(docSource);    
      int numPage = 0; 

      BufferedImage imagePage = pdfRenderer.renderImageWithDPI(numPage, 200); 
      PDImageXObject pdfXOImage = LosslessFactory.createFromImage(doc, imagePage); 

      contents.drawImage(pdfXOImage, 0,0, page.getMediaBox().getWidth(), page.getMediaBox().getHeight()); 
      contents.close(); 

     }catch (Exception e) { 
      // TODO: handle exception 
     } 

     // add XMP metadata 
     XMPMetadata xmp = XMPMetadata.createXMPMetadata(); 
     PDDocumentCatalog catalogue = doc.getDocumentCatalog(); 
     Calendar cal = Calendar.getInstance();   

     try 
     { 
      DublinCoreSchema dc = xmp.createAndAddDublinCoreSchema(); 
      // dc.setTitle(file); 
      dc.addCreator("My APPLICATION Creator"); 
      dc.addDate(cal); 

      PDFAIdentificationSchema id = xmp.createAndAddPFAIdentificationSchema(); 
      id.setPart(3); //value => 2|3 
      id.setConformance("A"); // value => A|B|U 

      XmpSerializer serializer = new XmpSerializer(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      serializer.serialize(xmp, baos, true); 

      PDMetadata metadata = new PDMetadata(doc); 
      metadata.importXMPMetadata(baos.toByteArray());     
      catalogue.setMetadata(metadata); 
     } 
     catch(BadFieldValueException e) 
     { 
      throw new IllegalArgumentException(e); 
     } 

     // sRGB output intent 
     InputStream colorProfile = CreatePDFA.class.getResourceAsStream(
       "../../../pdmodel/sRGB.icc"); 
     PDOutputIntent intent = new PDOutputIntent(doc, colorProfile); 
     intent.setInfo("sRGB IEC61966-2.1"); 
     intent.setOutputCondition("sRGB IEC61966-2.1"); 
     intent.setOutputConditionIdentifier("sRGB IEC61966-2.1"); 
     intent.setRegistryName("http://www.color.org"); 

     catalogue.addOutputIntent(intent); 
     catalogue.setLanguage("en-US"); 

     PDViewerPreferences pdViewer =new PDViewerPreferences(page.getCOSObject()); 
     pdViewer.setDisplayDocTitle(true);; 
     catalogue.setViewerPreferences(pdViewer); 

     PDMarkInfo mark = new PDMarkInfo(); // new PDMarkInfo(page.getCOSObject()); 
     PDStructureTreeRoot treeRoot = new PDStructureTreeRoot(); 
     catalogue.setMarkInfo(mark); 
     catalogue.setStructureTreeRoot(treeRoot);   
     catalogue.getMarkInfo().setMarked(true); 

     PDDocumentInformation info = doc.getDocumentInformation();    
     info.setCreationDate(cal); 
     info.setModificationDate(cal);    
     info.setAuthor("My APPLICATION Author"); 
     info.setProducer("My APPLICATION Producer");; 
     info.setCreator("My APPLICATION Creator"); 
     info.setTitle("PDF title"); 
     info.setSubject("PDF to PDF/A{2,3}-{A,U,B}");   

     doc.save(resultFile); 
    }catch (Exception e) { 
     throw new IllegalArgumentException(e); 
    } 
} 
+0

Ответ, вероятно, хорошо (я должен был бы запустить код через валидатор, чтобы убедиться); но распаковка файла jpeg неэффективна. Вместо этого используйте 'JPEGFactory.createFromStream()'. Это использует файл jpg как есть. Было бы неплохо изменить код, чтобы избежать копирования и вставки людей для использования этой части. И если вы все еще хотите декодировать Jpeg для получения BufferedImage, нужна только одна строка: ImageIO.read(). Ваши много строк устарели или очень новы :-) –

+0

Здесь задача не распаковывать JPEG :). В противном случае вы можете напрямую создавать BufferedImage со страницы PDF с помощью PDFRenderer.renderImageWithDPI (...) с PDFBOX. С другой стороны, результат был подтвержден: pdf-online. –

+0

Я знаю, что целью является создание PDF-файла. Мое замечание об изображении в PDF. Ваше использование LosslessFactory с jpeg-файлом делает его медленнее (потому что он будет распаковывать jpeg и повторно сжимать его с помощью сжатия Flate) и обычно создает большие PDF-файлы, чем если вы используете JPEGFactory с потоковым вводом. –

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

  • Нет связанных вопросов^_^