Я столкнулся с очень сложной проблемой. У нас есть формы, которые должны были быть заполнены, но некоторые люди использовали текстовые комментарии в форме аннотации в foxit вместо заполнения полей формы, поэтому аннотации никогда не сглаживаются. Когда наше программное обеспечение рендеринга генерирует окончательный документ, аннотации не включаются.
Решение, которое я попробовал, состоит в том, чтобы в основном go просмотреть документ, получить текстовое содержание аннотации и записать его в pdf, чтобы он был в конечном документе, затем удалить фактическую аннотацию, но я столкнулся с проблемой где я не знаю, какой шрифт использует аннотация, межстрочный интервал и т. д. c, поэтому я не могу узнать, как получить его из pdfbox для точного воссоздания, когда аннотация выглядит на неоткрытой форме. По сути, я хочу сгладить аннотации произвольной формы, созданные в foxit (функция комментариев пишущей машинки). Вот код. Это работает, но я снова пытаюсь понять, как получить аннотации для записи в мой окончательный PDF-документ. Опять сглаживать на акроформе не работает, потому что это не поля акроформы! Живой код отфильтровывает все, что не является аннотацией типа свободного текста, но приведенный ниже код должен показать мою проблему.
public static void main(String [] args)
{
String startDoc = "C:/test2/test.pdf";
String finalFlat = "C:/test2/test_FLAT.pdf";
try {
// for testing
try {
//BasicConfigurator.configure();
File myFile = new File(startDoc);
PDDocument pdDoc = PDDocument.load( myFile );
PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
PDAcroForm pdAcroForm = pdCatalog.getAcroForm();
// set the NeedApperances flag
pdAcroForm.setNeedAppearances(false);
// correct the missing page link for the annotations
for (PDPage page : pdDoc.getPages()) {
for (PDAnnotation annot : page.getAnnotations()) {
System.out.println(annot.getContents());
System.out.println(annot.isPrinted());
System.out.println(annot.isLocked());
System.out.println(annot.getAppearance().toString());
PDPageContentStream contentStream = new PDPageContentStream(pdDoc, page, PDPageContentStream.AppendMode.APPEND,true,true);
int fontHeight = 14;
contentStream.setFont(PDType1Font.TIMES_ROMAN, fontHeight);
float height = annot.getRectangle().getLowerLeftY();
String s = annot.getContents().replaceAll("\t", " ");
String ss[] = s.split("\\r");
for(String sss : ss)
{
contentStream.beginText();
contentStream.newLineAtOffset(annot.getRectangle().getLowerLeftX(),height );
contentStream.showText(sss);
height = height + fontHeight * 2 ;
contentStream.endText();
}
contentStream.close();
page.getAnnotations().remove(annot);
}
}
pdAcroForm.flatten();
pdDoc.save(finalFlat);
pdDoc.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
catch (Exception e) {
System.err.println("Exception: " + e.getLocalizedMessage());
}
}