将图像添加到现有文档

时间:2014-10-12 13:38:01

标签: pdf itext pdfstamper

在我的应用程序中,我必须将条形码图像添加到现有的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();

1 个答案:

答案 0 :(得分:4)

确实很明显,您没有时间编写代码,因为它充满了错误。即使你的问题也是错的!您问“如何将图像添加到现有PDF?”但是,在阅读代码时,您实际上想要将条形码添加到现有PDF的每个页面。您创建条形码然后将其转换为图像。为什么不将条形码添加为Form XObject?此外,完全不清楚为什么使用contentByte.fill()。此外,您将图像添加到硬编码位置。那是明智的吗?

我写了一个示例,它将条形码添加到包含16页的PDF的每个页面: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条形码(用零填充)。我根据我要添加条形码的页面的页面大小来计算xy值。我没有创建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);
}