我有一套PDF相册模板(它们有空白方块,文字和照片应该去)。我需要使用这些模板来生成实际的相册。
我的计划是使用iText和Java。我会向应用程序发送一个包含所有图像URL的数组。我将确切地知道图像应放在模板上的位置,并使用绝对定位来放置它们。
我只是想知道是否有更简单或更简洁的方法 - 即使这意味着使用不同的语言?生成PDF后,它们会自动发送给要求它们为PDF的打印机。
答案 0 :(得分:1)
我认为使用ImageMagick可以在很多语言(甚至是shell脚本)中轻松完成。
答案 1 :(得分:0)
目前尚不清楚是否有文字包装照片。无论如何,我会看Apache-FOP。我经常使用它 - 它可能需要一些定制。
答案 2 :(得分:0)
PdfReader reader = new PdfReader("template.pdf");
PdfStamper stamper = new PdfStamper( reader, new FileOutputStream("output.pdf"));
PdfContentByte content = stamper.getOverContent(1); // first page == 1
Image image = Image.createInstance("someImage.png");
image.setAbsolutePosition( x, y );
image.setAbsoluteHeight( hei );
image.setAbsoluteWidth( wid );
content.addImage(image);
// instead of absolutely positioning the image, you can do:
//content.addImage( image, wid, 0f, 0f, hei, x, y );
// that's a transformation matrix, you can skew, rotate, scale, etc.
stamper.close();
如果您不知道具体位置,可以选择几种方式。
1)替换现有图像。
使用此选项,您实际上可以让模板稍微悬挂在图像上,使用Alpha混合等等。得到花哨。如果您使用stamper.getUnderContent(1)
并使用透明背景构建模板,则可以使用上述代码执行相同的操作。我刚回答了replace an image question,应该在这方面提供帮助。
新图像将继承占位符图像的所有图形状态。 x,y,wid,hei,可选内容组,透明度,各种事物。
2)在Acrobat(或我想到的iText)中为模板添加注释(字段易于访问),并使用它的RECT为上面的代码提供x,y,wid,hei。
// given the above stamper
AcroFields fields = stamper.getAcroFields();
PdfDictionary replaceAnnot = fields.getFieldItem("ReplaceMe").getMerged(0);
//we can remove the field from the PDF without breaking the info in replaceAnnot.
fields.removeField("ReplaceMe");
// rects are laid out [llx, lly, urx, ury]
PdfArray rect = replaceAnnot.getAsArray(PdfName.RECT);
float x = rect.getAsNumber(0).floatValue();
float y = rect.getAsNumber(1).floatValue();
float width = rect.getAsNumber(2).floatValue() - x;
float height = rect.getAsNumber(3).floatValue() - y;
将这些坐标输入上面的图像代码,你就可以了。