2016-10-31 51 views
0

为了查找添加的图像文件并在下次阅读PDF时将其替换为另一个图像文件,我想使用Itext将图像文件添加到现有的PDF中,并为其声明唯一的名称。 我的代码:如何使用Itext将图像文件添加到现有PDF中,并为其声明唯一的名称?

final PdfName key = new PdfName("MY_SIGN_KEY"); 
    final PdfName val = new PdfName("MY_SIGN_VAL"); 

    Image signImage=Image.getInstance(signPngFile.getAbsolutePath()); 
    signImage.setAlignment(1); 
    signImage.scaleAbsolute(newWidth, newHeight); 
    signImage.setAbsolutePosition(200,200); 

    PdfContentByte over = stamper.getOverContent(1); 
    PdfImage stream = new PdfImage(signImage, "", null); 
    stream.put(key,val);// a unique name for it.(设置唯一标识符) 

    //PdfIndirectObject ref=over.getPdfWriter().addToBody(stream); 
    //signImage.setDirectReference(ref.getIndirectReference()); 
    over.addImage(signImage); 
+0

您正在使用我书中的代码来解释如何满足您的要求。你的问题是什么?看来你已经知道答案了。 –

+0

对不起,我没有描述清楚,上面的代码可以将图像添加到PDF。但名称与图像无关。 如果代码未被注释: PdfIndirectObject ref = over。 GetPdfWriter(。)addToBody(stream); SignImage。 SetDirectReference(ref。GetIndirectReference()); 可以将图像添加到PDF中。名字是正确的关联,但整个图片是黑色的。 – user3648781

+0

所以你试图创建一个像这样的图像的PDF:[SpecialId](http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-16#622-specialid.java)。然后你想用这样的ID找到那个图像:[ResizeImage](http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-16#621-resizeimage.java)。问题是,当你使用'ref'时,你会得到一个黑色的图像。也许你应该重新解释你的问题,以便专注于这个问题。 –

回答

1

我试过你的代码,它适用于我。见AddImageWithID例如:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    Image image = Image.getInstance(IMG); 
    PdfImage stream = new PdfImage(image, "", null); 
    stream.put(new PdfName("ITXT_SpecialId"), new PdfName("123456789")); 
    PdfIndirectObject ref = stamper.getWriter().addToBody(stream); 
    image.setDirectReference(ref.getIndirectReference()); 
    image.setAbsolutePosition(36, 400); 
    PdfContentByte over = stamper.getOverContent(1); 
    over.addImage(image); 
    stamper.close(); 
    reader.close(); 
} 

在这个例子中,我采取了一个名为hello.pdf文件,我添加一个名为bruno.jpg图片与文件hello_with_image_id.pdf作为结果。

的图像看起来不黑:添加

enter image description here

的ID:

enter image description here

你可以试试我的共享代码,看看问题是否仍然存在。

我可以想出为什么你会得到黑色图像的一个原因:在我们的代码中,我们假设添加了一个图像。在JPEG的情况下,情况总是如此。但在PNG或GIF的情况下,添加一个源图像可能会导致添加两个图像。严格地说,PDF不支持透明图像(取决于您如何解释透明图像的概念)。无论何时用透明部件添加单个源图像,都会将两个图像添加到PDF中:一个不透明图像和一个图像蒙版。不透明图像和图像蒙版的组合产生被视为透明图像的东西。也许这就是你的情况。

+0

它是图像问题还是Itext不支持具有透明信息(PNG)的图像?我试图让图像的背景不透明,上面的代码可以工作。我的需要是添加一个透明背景的图像。这不会覆盖PDF的原始内容,并且下一个可以更改为要替换的图像。 PS:如果不添加与代码相关的图像名称,但可以正常显示PNG图像。 我在android环境开发中。 – user3648781

+0

iText支持透明的PNG图像; PDF不。您为透明PNG添加唯一ID的设计存在缺陷,因为在PDF中没有一个透明的PNG;有不透明的图像和图像蒙版。 –

相关问题