Image 重新缩放PDF中的图像

Image 重新缩放PDF中的图像,image,pdf,Image,Pdf,我对PDF的内部结构有一些了解,但显然还不够。所以我的问题可能看起来很傻 几年前,我为一个客户创建了一个PDF。我从一个模板开始,并手动更改了许多内容(主要使用Perl语言,使用CAM::PDF模块)。现在,客户希望我将PDF中的一个图像更改为新版本。我发现重新开始这个过程太复杂了,所以我让她给我发一份新的PDF,里面有新的图片,然后我会复制粘贴它。在“复制和粘贴”中,我的意思是从新文件复制图像对象,并将其插入旧文件中,替换那里的图像对象。PDF有一个函数可以完全做到这一点(replaceObj

我对PDF的内部结构有一些了解,但显然还不够。所以我的问题可能看起来很傻

几年前,我为一个客户创建了一个PDF。我从一个模板开始,并手动更改了许多内容(主要使用Perl语言,使用CAM::PDF模块)。现在,客户希望我将PDF中的一个图像更改为新版本。我发现重新开始这个过程太复杂了,所以我让她给我发一份新的PDF,里面有新的图片,然后我会复制粘贴它。在“复制和粘贴”中,我的意思是从新文件复制图像对象,并将其插入旧文件中,替换那里的图像对象。PDF有一个函数可以完全做到这一点(replaceObject)

新图像被正确复制,覆盖了旧图像,但现在它被错误地缩放。在客户发送给我的文件中,原始图像和完全相同的图像看起来更大

我不会把所有的文件都放在一起——它们太大了。我将在这里给出图像对象,省略流,我希望这足以理解发生了什么

原始文件包含:

39 0 obj
<< /Type /Page
/Annots [ null 45 0 R 46 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R
16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R
25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 3 0 R 79 0 R 80 0 R
81 0 R ]
/Contents 86 0 R /CropBox [ 0 0 612 792 ]
/Group << /Type /Group /CS /DeviceRGB /S /Transparency >>
/MediaBox [ 0 0 612 792 ] /Parent 35 0 R
/Resources << /ExtGState << /GS13 87 0 R /GS19 88 0 R >>
/Font << /F1 89 0 R /F2 90 0 R /F3 91 0 R /F4 92 0 R /F5 93 0 R /Xi0 94 0 R >>
/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
/XObject << /Image12 95 0 R >> >>
/StructParents 0 /Tabs /S >>
endobj

95 0 obj
<< /Type /XObject /Subtype /Image /BitsPerComponent 8
/ColorSpace /DeviceRGB /Filter /FlateDecode /Height 115
/Interpolate false /Length 12792 /Width 219 >>
stream
.....endstream
endobj
3 0 obj
<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F3 13 0 R/F4 19 0 R/F5 24 0             R>>/ExtGState<</GS12 12 0 R/GS18 18 0 R>>/XObject<</Image27 27 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 26 0 R] /MediaBox[ 0 0 612 792] /Contents 4 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 0>>
endobj

27 0 obj
<</Type/XObject/Subtype/Image/Width 206/Height 88/ColorSpace/DeviceRGB/BitsPerComponent 8/Interpolate     false/SMask 28 0 R/Filter/FlateDecode/Length 6984>>
stream ...
endstream
endobj

28 0 obj
<</Type/XObject/Subtype/Image/Width 206/Height 88/ColorSpace/DeviceGray/Matte[ 0 0 0]     /BitsPerComponent 8/Interpolate false/Filter/FlateDecode/Length 2235>>
stream ...
endstream
endobj
390obj
/MediaBox[0 0 612 792]/父项35 0 R
/资源
/字体>
/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]
/XObject>>>
/结构父对象0/Tabs/S>>
endobj
95 0 obj
>
流动
……尾流
endobj
我从中复制的新文件包含:

39 0 obj
<< /Type /Page
/Annots [ null 45 0 R 46 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R
16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R
25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 3 0 R 79 0 R 80 0 R
81 0 R ]
/Contents 86 0 R /CropBox [ 0 0 612 792 ]
/Group << /Type /Group /CS /DeviceRGB /S /Transparency >>
/MediaBox [ 0 0 612 792 ] /Parent 35 0 R
/Resources << /ExtGState << /GS13 87 0 R /GS19 88 0 R >>
/Font << /F1 89 0 R /F2 90 0 R /F3 91 0 R /F4 92 0 R /F5 93 0 R /Xi0 94 0 R >>
/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
/XObject << /Image12 95 0 R >> >>
/StructParents 0 /Tabs /S >>
endobj

95 0 obj
<< /Type /XObject /Subtype /Image /BitsPerComponent 8
/ColorSpace /DeviceRGB /Filter /FlateDecode /Height 115
/Interpolate false /Length 12792 /Width 219 >>
stream
.....endstream
endobj
3 0 obj
<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F3 13 0 R/F4 19 0 R/F5 24 0             R>>/ExtGState<</GS12 12 0 R/GS18 18 0 R>>/XObject<</Image27 27 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 26 0 R] /MediaBox[ 0 0 612 792] /Contents 4 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 0>>
endobj

27 0 obj
<</Type/XObject/Subtype/Image/Width 206/Height 88/ColorSpace/DeviceRGB/BitsPerComponent 8/Interpolate     false/SMask 28 0 R/Filter/FlateDecode/Length 6984>>
stream ...
endstream
endobj

28 0 obj
<</Type/XObject/Subtype/Image/Width 206/Height 88/ColorSpace/DeviceGray/Matte[ 0 0 0]     /BitsPerComponent 8/Interpolate false/Filter/FlateDecode/Length 2235>>
stream ...
endstream
endobj
30对象
endobj
27 0 obj
流动
尾流
endobj
28 0 obj
流动
尾流
endobj
因此,Perl函数将对象27从新文件复制到旧文件中,将其重命名为95(删除旧的95对象),并且还复制了对象28(如果需要的话,将其命名为256)。现在,对象95引用对象256。嗯,我们看到新图像的高度和宽度比原始图像小,但有趣的是,生成的PDF显示(新)图像比原始图像和客户发送给我的文件中的图像都大。所以我想它被重新调用是有原因的。但我不知道为什么,因为两个文件的MediaBox是相同的


需要帮忙吗?

好的,我找到了。它是页面内容流中的cm操作符。