Добавить изображение в существующий документ

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

PdfReader reader = null ;
PdfStamper pdfStamper = null ;
PdfWriter writer = null ;

reader = new PdfReader("....\\barcode.pdf");
pdfStamper = new PdfStamper(reader, new FileOutputStream();

Barcode128 code128 = new Barcode128();
String barcodeValue = "" ;
code128.setCode(barcodeValue);
PdfContentByte contentByte = null ;

for(int i = 1 ; i <= reader.getNumberOfPages() ; i ++){
      contentByte = pdfStamper.getUnderContent(i);
      code128.setAltText("");
      code128.setBarHeight((float) (10));

      Image image = code128.createImageWithBarcode(contentByte, null, null);
      image.setAbsolutePosition(23f, 20f);
      image.setBackgroundColor(CMYKColor.WHITE);

      image.setWidthPercentage(75);
      contentByte.fill();
      contentByte.addImage(image);
      contentByte.fill();
}
PdfDocument pdfDocument = contentByte.getPdfDocument();
writer = PdfWriter.getInstance(pdfDocument, new FileOutputStream());

reader.close();
pdfStamper.close();
writer.close();

person user1636102    schedule 12.10.2014    source источник


Ответы (1)


Действительно ясно, что у вас не было времени приложить усилия для написания кода, так как он пронизан ошибками. Даже ваш вопрос неверен! Вы спрашиваете "Как я могу добавить изображение в существующий PDF-файл?" Однако при чтении кода вы на самом деле хотите добавить штрих-код на каждую страницу существующего PDF-файла. Вы создаете штрих-код, и затем конвертируете его в изображение. Почему бы вам не добавить штрих-код как XObject формы? Кроме того, совершенно непонятно, почему вы используете contentByte.fill(). Кроме того, вы добавляете изображение в жестко заданную позицию. Это мудро?

Я написал пример, который добавляет штрих-код на каждую страницу PDF-файла с 16 страницами: StampBarcode

PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
int n = reader.getNumberOfPages();
Rectangle pagesize;
for (int i = 1; i <= n; i++) {
    PdfContentByte over = stamper.getOverContent(i);
    pagesize = reader.getPageSize(i);
    float x = pagesize.getLeft() + 10;
    float y = pagesize.getTop() - 50;       
    BarcodeEAN barcode = new BarcodeEAN();
    barcode.setCodeType(Barcode.EAN8);
    String s = String.valueOf(i);
    s = "00000000".substring(s.length()) + s; 
    barcode.setCode(s);
    PdfTemplate template =
            barcode.createTemplateWithBarcode(over, BaseColor.BLACK, BaseColor.BLACK);
    over.addTemplate(template, x, y);
}
stamper.close();
reader.close();

Как видите, я использовал штрих-код EAN8, который показывает номер страницы (дополненный нулями). Я рассчитываю значения x и y на основе размера страницы, на которую я добавляю штрих-код. Я не создаю объект Image. Вместо этого я использую объект PdfTemplate.

Получившийся PDF-файл: add_barcode.pdf

Как видите, в левом верхнем углу каждой страницы есть штрих-код.

Дополнительное примечание:

у кого-то хватило наглости понизить этот ответ. Я не понимаю, почему. Единственная причина, по которой я могу думать, заключается в том, что мой ответ был слишком хорош в том смысле, что я объяснил, как добавить штрих-код вместо изображения. Позвольте мне объяснить, как это делается. Достаточно заменить метод addTemplate() на метод addImage().

for (int i = 1; i <= n; i++) {
    PdfContentByte over = stamper.getOverContent(i);
    pagesize = reader.getPageSize(i);
    float x = pagesize.getLeft() + 10;
    float y = pagesize.getTop() - 50;
    Image img = Image.getInstance("image" + i + ".jpg");
    img.setAbsolutePosition(x, y);
    over.addImage(img);
}
person Bruno Lowagie    schedule 12.10.2014