2014-01-20 2 views
0

Глава 6 IText в действии описывает, как копировать страницы с помощью PdfSmartCopy/PdfCopy:PdfCopy и форма значения с IText: значения формы не видно

public void addDataSheets(PdfCopy copy) 
     throws SQLException, IOException, DocumentException { 
     // Create a database connection 
     DatabaseConnection connection = new HsqldbConnection("filmfestival"); 
     List<Movie> movies = PojoFactory.getMovies(connection); 
     PdfReader reader; 
     PdfStamper stamper; 
     ByteArrayOutputStream baos; 
     // Loop over all the movies and fill out the data sheet 
     for (Movie movie : movies) { 
      reader = new PdfReader(DATASHEET); 
      baos = new ByteArrayOutputStream(); 
      stamper = new PdfStamper(reader, baos); 
      fill(stamper.getAcroFields(), movie); 
      stamper.setFormFlattening(true); 
      stamper.close(); 

      reader = new PdfReader(baos.toByteArray()); 
      copy.addPage(copy.getImportedPage(reader, 1)); 
     } 
     // Close the database connection 
     connection.close(); 
    } 

Это прекрасно работает, но на моем вновь созданном документе, значения внутри полей формы не видны, если я не нажму на нее. Если я открою PDF в Chrome, я могу увидеть значения формы.

По-видимому, из Editable .pdf fields disappear (but visible on field focus) after save with evince, вы обнаружите, что есть флаг, который необходимо установить в формате pdf.

public void createPdf(String filename) 
    throws IOException, DocumentException, SQLException { 
    // step 1 
    Document document = new Document(); 
    // step 2 
    PdfCopy copy 
     = new PdfCopy(document, new FileOutputStream(filename)); 
    // step 3 
    document.open(); 
    // step 4 
    addDataSheets(copy); 
    // step 5 
    document.close(); 
} 

Есть ли способ сделать это с использованием текущего API без использования отражения или повторного открытия pdf?

ответ

2

Просьба ознакомиться с обновленным примером FillDataSheet на веб-сайте iText. Вы обнаружите, что следующая строка была добавлена:

fields.setGenerateAppearances(true); 

IText используется, чтобы игнорировать этот флаг и всегда созданные появления, даже если PDF прямо сказал, что никакие выступлений не нужно быть созданы. В более поздних версиях учитывается значение флага и не создаются видимости в случае, если в PDF говорится, что видимость не требуется (что, вероятно, имеет место в вашем PDF-файле).

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