PDF-файл с изображением водяного знака, созданный с помощью iText Java - PullRequest
0 голосов
/ 05 июня 2018

При отправке pdf-файла на принтер выдается сообщение об ошибке: «На этой странице существует ошибка. Acrobat может отображать страницу неправильно. Пожалуйста, свяжитесь с лицом, создавшим PDF-документ, для устранения проблемы».

Я создаю файл PDF, а также добавляю к нему изображение водяного знака, используя текст java.

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

ДонНе знаете, что именно проблема с изображением водяного знака?Пожалуйста, помогите.

Ниже приведен фрагмент кода:

PdfReader pdfReader = new PdfReader(finalPath);
int noOfPages = pdfReader.getNumberOfPages();

PdfStamper stamp = new PdfStamper(pdfReader, new FileOutputStream(fileNameAfterWatermark));
int i = 0;
PdfContentByte underContent;    
PdfGState gs;
while (i < noOfPages) {
    i++;
    underContent = stamp.getUnderContent(i);
    gs = new PdfGState();
    gs.setFillOpacity(0.3f);                
    gs.setStrokeOpacity(0.3f);              
    Rectangle  pagesize = pdfReader.getPageSize(i);
    int pageRotation = pdfReader.getPageRotation(i);
    float  x = (pagesize.getLeft() + pagesize.getRight()) / 2 ;
    float  y = (pagesize.getTop() + pagesize.getBottom()) / 2 ;
    if(pageRotation != 0){

         x = (pagesize.getHeight()) / 2;
         y = (pagesize.getWidth()) / 2;

         y = y - 80;

    }
    float w = image.getScaledWidth();
    float h = image.getScaledHeight();
    float scaleMultiplicationFactor = 1.25f;
    float image_width = (w * (scaleMultiplicationFactor));
    float image_height = (h * (scaleMultiplicationFactor));
    float x_co_ordinate = x - (image_width / 2 );
    float y_co_ordinate = y - (image_height / 2);
    int fontSize = 180;

    underContent.saveState();
    underContent.setGState(gs);
    underContent.beginText();
    underContent.setFontAndSize(bf, fontSize);
    underContent.setColorFill(Color.LIGHT_GRAY);
    underContent.addImage(image, image_width, 0, 0, image_height, x_co_ordinate , y_co_ordinate );
    underContent.endText();
    underContent.restoreState();

}

stamp.close();
pdfReader.close();

1 Ответ

0 голосов
/ 06 июня 2018

Вы добавляете свое содержание водяного знака в UnderContent следующим образом:

underContent.saveState();
underContent.setGState(gs);
underContent.beginText();
underContent.setFontAndSize(bf, fontSize);
underContent.setColorFill(Color.LIGHT_GRAY);
underContent.addImage(image, image_width, 0, 0, image_height, x_co_ordinate , y_co_ordinate );
underContent.endText();
underContent.restoreState();

Т.е. вы добавляете свое (растровое изображение) к нему внутри текстового объекта .Это недопустимо, текстовые объекты могут не содержать внешние объекты или встроенные объекты изображения.Добавьте изображение вне текстового объекта:

underContent.saveState();
underContent.setGState(gs);
underContent.beginText();
underContent.setFontAndSize(bf, fontSize);
underContent.setColorFill(Color.LIGHT_GRAY);
underContent.endText();
underContent.addImage(image, image_width, 0, 0, image_height, x_co_ordinate , y_co_ordinate );
underContent.restoreState();

При этом вы ничего не добавляете в этот текстовый объект.Таким образом, вы можете уменьшить код до:

underContent.saveState();
underContent.setGState(gs);
underContent.addImage(image, image_width, 0, 0, image_height, x_co_ordinate , y_co_ordinate );
underContent.restoreState();

Кроме того, вы добавляете этот контент в UnderContent.Таким образом, прозрачность, установленная в PdfGState, просто делает изображение бледнее.Если бы вы могли сделать исходное растровое изображение настолько бледным, насколько это в конечном итоге необходимо, вам вообще не нужно использовать этот PdfGState.В некоторых профилях PDF прозрачность запрещена, поэтому избавление от нее также может быть выгодным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...