在我目前的代码中,我正在合并包含PDF文件的文档。
public static void appApplicantDownload(File file) {
Connection con = getConnection();
Scanner sc = new Scanner(System.in);
List < InputStream > list = new ArrayList < InputStream > ();
try {
OutputStream fOriginal = new FileOutputStream(file, true); // original
list.add(new FileInputStream(file1));
list.add(new FileInputStream(file2));
list.add(new FileInputStream(file3));
doMerge(list, fOriginal);
} catch (Exception e) {
}
}
public static void doMerge(List < InputStream > list, OutputStream outputStream) throws DocumentException, IOException {
try {
System.out.println("Merging...");
Document document = new Document();
PdfCopy copy = new PdfCopy(document, outputStream);
document.open();
for (InputStream in : list) {
ByteArrayOutputStream b = new ByteArrayOutputStream();
IOUtils.copy( in , b);
PdfReader reader = new PdfReader(b.toByteArray());
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
copy.addPage(copy.getImportedPage(reader, i));
}
}
outputStream.flush();
document.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
但是现在我想更改代码,以便它允许合并Image和PDF。上面的代码给出了没有找到PDF签名
的错误答案 0 :(得分:2)
首先,你必须知道文件是PDF还是图像。最简单的方法是使用文件的扩展名。因此,您将获得该文件的扩展名,然后将此信息传递给您的doMerge
方法。要做到这一点,我会改变你当前的方法
public static void doMerge(List<InputStream> list, OutputStream outputStream)
像
这样的东西public static void doMerge(Map<InputStream, String> files, OutputStream outputStream)
因此每个InputStream
都与扩展程序相关联。
其次,你必须单独加载图像和pdf。所以你的循环应该看起来像
for (InputStream in : files.keySet()) {
String ext = files.get(in);
if(ext.equalsIgnoreCase("pdf"))
{
//load pdf here
}
else if(ext.equalsIgnoreCase("png") || ext.equalsIgnoreCase("jpg"))
{
//load image here
}
}
在java中,您可以使用Image
轻松加载ImageIO
。有关此主题的更多详细信息,请查看此问题:Load image from a filepath via BufferedImage
然后将图像添加到PDF中,使用PdfWriter
PdfWriter pw = PdfWriter.GetInstance(doc, outputStream);
Image img = Image.GetInstance(inputStream);
doc.Add(img);
doc.NewPage();
如果您想在之前将图像转换为PDF并合并之后也可以这样做,但您只需使用PdfWriter将它们全部写入。
答案 1 :(得分:0)
在已打开的PDF文档中创建一个新页面,并使用该功能插入图像以将图像放置在该页面上。