Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PDFbox 1.7.0-如何在使用PDFbox添加新图像的同时保留现有图像?_Java_Image_Pdfbox - Fatal编程技术网

Java PDFbox 1.7.0-如何在使用PDFbox添加新图像的同时保留现有图像?

Java PDFbox 1.7.0-如何在使用PDFbox添加新图像的同时保留现有图像?,java,image,pdfbox,Java,Image,Pdfbox,我使用的是PDFBox 1.7.0(由于生产服务器中的旧版本,我无法选择该版本)。我试图添加一个图像到现有的PDF已经有一个标志。 当我添加新图像时,旧图像会像被替换一样消失 //用于将mm转换为点 // ... 每英寸72点 静态最终整数默认值用户空间单位DPI=72; // ... 毫米->英寸->点 静态最终浮点毫米到单位=1/(10*2.54f)*默认用户空间单位DPI; /** *将给定图像添加到PDF的特定页面 *@param document要处理的PDF文档 *@param输入

我使用的是PDFBox 1.7.0(由于生产服务器中的旧版本,我无法选择该版本)。我试图添加一个图像到现有的PDF已经有一个标志。 当我添加新图像时,旧图像会像被替换一样消失


//用于将mm转换为点
// ... 每英寸72点
静态最终整数默认值用户空间单位DPI=72;
// ... 毫米->英寸->点
静态最终浮点毫米到单位=1/(10*2.54f)*默认用户空间单位DPI;
/**
*将给定图像添加到PDF的特定页面
*@param document要处理的PDF文档
*@param输入图像输入流
*@param pdfpage页码到目标
*@param x图像位置(英制毫米)
*@参数y图像位置(英制毫米)
*@param width图像的最大宽度(mm)
*@param height图像的最大高度(en mm)
*@param不透明度图像的不透明度级别(分数)
*/
void addImagePage(PDDocument文档、InputStream输入、int-pdfpage、int-x、int-y、int-width、int-height、float-opacity)引发IOException{
如果(输入!=null){
//将inputstream转换为可用的BuffereImage
BuffereImage tmp_image=ImageIO.read(输入);
//用户键入_4BYTE_ABGR以使用透明PNG修复PDFBox问题
BuffereImage=新的BuffereImage(tmp_image.getWidth()、tmp_image.getHeight()、BuffereImage.TYPE_4BYTE_ABGR);
//准备图像
image.createGraphics().DrawRenderImage(tmp_图像,null);
PDXObjectImage ximage=新的PDPixelMap(文档、图像);
//调整图像大小
int-iWidth=ximage.getWidth();
int iHeight=ximage.getHeight();
如果(宽度/高度>宽度/高度){
ximage.setWidth(Math.round(宽度*MM_到_单位));
ximage.setHeight(数学圆((iHight*宽度/iWidth)*MM_至_单位);
}否则{
ximage.setWidth(数学圆((i宽度*高度/i高度)*毫米单位);
ximage.setHeight(数学圆(高度*MM_至_单位));
}
//检索要更新的页面
PDPage page=(PDPage)document.getDocumentCatalog().getAllPages().get(pdfpage);
PDResources=page.findResources();
//获取图形状态
Map graphicsStates=resources.getGraphicsStates();
if(graphicsStates==null){
graphicsStates=新HashMap();
}
//设置图形状态配置
PDExtendedGraphicsState extendedGraphicsState=新的PDExtendedGraphicsState();
//设置图像的不透明度
extendedGraphicsState.SetNonSrokingAlphaconstant(不透明度);
graphicsStates.put(“TransparentState”,extendedGraphicsState);
//恢复图形状态
resources.setGraphicsStates(graphicsStates);
//检索内容流
PDPageContentStream contentStream=新的PDPageContentStream(文档,页面,true,true);
//激活透明度选项
contentStream.appendRawCommands(“/TransparentState gs\n”);
contentStream.endMarkedContentSequence();
//插入图像
contentStream.drawImage(
西玛吉,
(浮动)x*MM_至_单位,
(浮动)y*MM_至_单位
);
//关闭小溪
contentStream.close();
}
}
我希望在页面中有新图像,但页面中的现有图像已消失,而不是新图像


使用过的PDF示例:

1.7中有几个错误。。。一个是我在一篇评论中提到的(事实证明它不会影响您),另一个是资源进行了一些缓存,但没有得到适当的管理……长话短说,您需要像这样保存和恢复xobject资源:

Map<String, PDXObject> xObjectsMap = page.getResources().getXObjects(); // save xobjects
…
PDXObjectImage ximage = new PDPixelMap (document, image);
String imgName = page.getResources().addXObject(ximage, "Im");
cs.drawImage(ximage, 0, 0); // bug happens here, old xobjects gets lost
xObjectsMap.put(imgName, ximage);
page.getResources().setXObjects(xObjectsMap); // restore xobjects
Map xObjectsMap=page.getResources().getXObjects();//保存XObject
…
PDXObjectImage ximage=新的PDPixelMap(文档、图像);
字符串imgName=page.getResources().addXObject(ximage,“Im”);
cs.drawImage(ximage,0,0);//错误发生在这里,旧的XObject丢失
xObjectsMap.put(imgName,ximage);
page.getResources().setXObjects(xObjectsMap);//还原XObject

这真的只是一个解决办法…可能会有更多糟糕的惊喜。您不应该使用旧版本。它们不再能激发快乐。你应该感谢他们的服务,然后让他们毫无愧疚地离开。

1.7中有几个bug。。。一个是我在一篇评论中提到的(事实证明它不会影响您),另一个是资源进行了一些缓存,但没有得到适当的管理……长话短说,您需要像这样保存和恢复xobject资源:

Map<String, PDXObject> xObjectsMap = page.getResources().getXObjects(); // save xobjects
…
PDXObjectImage ximage = new PDPixelMap (document, image);
String imgName = page.getResources().addXObject(ximage, "Im");
cs.drawImage(ximage, 0, 0); // bug happens here, old xobjects gets lost
xObjectsMap.put(imgName, ximage);
page.getResources().setXObjects(xObjectsMap); // restore xobjects
Map xObjectsMap=page.getResources().getXObjects();//保存XObject
…
PDXObjectImage ximage=新的PDPixelMap(文档、图像);
字符串imgName=page.getResources().addXObject(ximage,“Im”);
cs.drawImage(ximage,0,0);//错误发生在这里,旧的XObject丢失
xObjectsMap.put(imgName,ximage);
page.getResources().setXObjects(xObjectsMap);//还原XObject

这真的只是一个解决办法…可能会有更多糟糕的惊喜。您不应该使用旧版本。它们不再能激发快乐。你应该感谢他们的服务,然后让他们毫无愧疚地离开。

好的。我已经放弃尝试使用PDFBOX1.7进行这部分开发。它需要许多修复来实现很少的事情。对于将来的工作来说,它实际上是不可维护的。谢谢大家的提示和帮助。

好的。我已经放弃尝试使用PDFBOX1.7进行这部分开发。它需要许多修复来实现很少的事情。对于将来的工作来说,它实际上是不可维护的。感谢大家的提示和帮助。

尝试将
PDPageContentStream
的第五个构造函数设置为
true
。(如果它存在于1.7中)我有第五个参数(名为resetContext),但它不会改变任何设置的值