Word可能只是渲染放大的图像,并以这种方式将其作为打印机输入发送(我认为Distiller可以作为打印机使用)。如果是这样,那么这对于普通打印机是好的,但是对于生产PDF文件的假打印机来说效率很低。
例如pdfLaTeX将图像正确嵌入到输出文件中。检查我上传到min.us画廊的PDF:在LaTeX文档中嵌入图像
重要的是您正在使用什么PDF生成堆栈。如果尝试使用其他PDF打印机(例如出色且免费的PDFCreator)不能解决问题,则应尝试使用专用的PDF导出,即不作为打印机工作。AFAIK最新的Word版本具有内置的PDF导出功能,因此,如果在文档中嵌入了图像,则可以正确实现PDF导出功能。
巨大的编辑
图库已重命名为在LaTeX vs Word中嵌入PNG图像
我已经对mytest.pdf
pdfLaTeX生成的文件和test2.pdf
Word 生成的文件进行了更彻底的研究。
mytest.pdf
test2.pdf
让我们从解压缩开始。如果查看未压缩的文件,您将很容易发现图像流的开始(<<...>>stream
带有Width和Height参数的行,与中的相同test.png
,即176x295),并以endstream
标记结束。偷看时间。
(此时警告pdftk假定为版本1.41)
test2.pdf
$ pdftk test2.pdf output test2uc.pdf uncompress
$ sed '\,^<</Width 176[^>]*/Height 295[^>]*>>stream$,!d' test2uc.pdf
<</Width 176/BitsPerComponent 8/Interpolate true/Height 295/Filter[/DCTDecode]/Subtype/Image/Length 20003/ColorSpace/DeviceRGB/Type/XObject>>stream
$ sed '1,\,^<</Width 176[^>]*/Height 295[^>]*>>stream$,d;/^endstream$/,$d' test2uc.pdf > test2stream
$ xxd test2stream | head -10
0000000: ffd8 ffe0 0010 4a46 4946 0001 0101 0048 ......JFIF.....H
0000010: 0048 0000 ffe1 005c 4578 6966 0000 4d4d .H.....\Exif..MM
0000020: 002a 0000 0008 0004 0302 0002 0000 0016 .*..............
0000030: 0000 003e 5110 0001 0000 0001 0100 0000 ...>Q...........
0000040: 5111 0004 0000 0001 0000 0b13 5112 0004 Q...........Q...
0000050: 0000 0001 0000 0b13 0000 0000 5068 6f74 ............Phot
0000060: 6f73 686f 7020 4943 4320 7072 6f66 696c oshop ICC profil
0000070: 6500 ffe2 0c58 4943 435f 5052 4f46 494c e....XICC_PROFIL
0000080: 4500 0101 0000 0c48 4c69 6e6f 0210 0000 E......HLino....
0000090: 6d6e 7472 5247 4220 5859 5a20 07ce 0002 mntrRGB XYZ ....
$ file test2stream
test2stream: JPEG image data, JFIF standard 1.01
因此,Word在其内部输出上提供了JPEG而不是PNG,以进行进一步的PDF处理。哇!将输出发送到打印机时,可能会发生同样的事情。
test2stream.jpg
mytest.pdf
$ pdftk mytest.pdf output mytestuc.pdf uncompress
$ sed '\,^<</Width 176[^>]*/Height 295[^>]*>>stream$,!d' mytestuc.pdf
<</Width 176/BitsPerComponent 8/Height 295/Subtype/Image/Length 155760/ColorSpace/DeviceRGB/Type/XObject>>stream
$ sed '1,\,^<</Width 176[^>]*/Height 295[^>]*>>stream$,d;/^endstream$/,$d' mytestuc.pdf > myteststream
$ xxd myteststream | head -10
0000000: ebeb ebea eaea ecec eceb ebeb ebeb ebeb ................
0000010: ebeb ebeb ebec ecec ebeb ebeb ebeb ebeb ................
0000020: ebeb ebeb ebeb ebeb ebeb ebeb ebeb ebeb ................
0000030: ebeb ebea eaea eaea eaec ecec eaea eaec ................
0000040: ecec ebeb ebec ecec ebeb ebeb ebeb ebeb ................
0000050: ebeb ebeb ebeb ebeb ebeb ebeb ebeb ebeb ................
0000060: ebeb ebeb ebeb ebeb ebeb ebeb ebeb ebeb ................
0000070: ebeb ebeb ebeb ebeb ebeb ebeb ebeb ebeb ................
0000080: ebea eaea ecec eceb ebeb ebeb ebea eaea ................
0000090: ebeb ebeb ebeb ebeb ebeb ebeb ebeb ebeb ................
$ file myteststream
myteststream: DOS executable (COM)
它不是COM文件,但也不是PNG。
$ du -b test.png test2stream myteststream
57727 test.png
20004 test2stream
155761 myteststream
你现在看到了吗?pdfLaTeX生成的PDF图像(PNG)可能是简单的原始格式(176 * 295 * 3 = 155760,1来自多余的换行符)。让我们检查一下:
$ convert -depth 8 -size 176x295 rgb:myteststream myteststream.png
而且我们有了原始图像!不,等等 看起来pdftk 1.41的解压缩是错误的,图像几乎相同,但有一些缺陷。我已升级到pdftk 1.44,但此版本完全不解压缩图像流。而且pdftk不会在一行中输出流字典,因此使用sed进行的上述提取不再起作用,但是现在没有必要对其进行修复。
那么我们可以对Word做什么呢?没什么办法。至少您可以将嵌入式图像从一个PDF移植到另一个。我使用最近的pdftk重复解压缩两个PDF,在vim中打开它们,用test2uc.pdf
<<...>>stream...endstream
from 中的副本代替mytestuc.pdf
,另存为test2fixuc.pdf
并压缩为test2fix.pdf
。
test2fix.pdf
测试.pdf
毕竟不检查您的大PDF将是一种罪过。好的,我准备了另一个oneliner与pdftk 1.44未压缩的PDF一起使用,以列出图像流及其在文件中的开始行。因此,我将从解压缩开始test.pdf
。
(此时,警告pdftk假定为版本1.44)
$ pdftk test.pdf output testuc.pdf uncompress
$ awk '{if(i)h=h$0} /^[0-9]+ [0-9]+ obj $/{i=1;h=""}/^stream$/{i=0;if(h!~/\/Image/)next;print h,":"NR+1}' testuc.pdf
<</ColorSpace /DeviceRGB/Subtype /Image/Length 10443804/Width 707/Type /XObject/BitsPerComponent 8/Height 4924>>stream :619
<</ColorSpace /DeviceRGB/Subtype /Image/Length 11264460/Width 953/Type /XObject/BitsPerComponent 8/Height 3940>>stream :12106
<</ColorSpace /DeviceRGB/Subtype /Image/Length 2813256/Width 953/Type /XObject/BitsPerComponent 8/Height 984>>stream :12910
<</ColorSpace /DeviceRGB/Subtype /Image/Length 11264460/Width 953/Type /XObject/BitsPerComponent 8/Height 3940>>stream :18547
<</ColorSpace /DeviceRGB/Subtype /Image/Length 2813256/Width 953/Type /XObject/BitsPerComponent 8/Height 984>>stream :19312
<</ColorSpace /DeviceRGB/Subtype /Image/Length 4845216/Width 328/Type /XObject/BitsPerComponent 8/Height 4924>>stream :19326
这里真是疯了!6个原始图像(显然这次pdftk在解压缩时没有任何问题)合计为43444452字节!让我们重新检查test2uc.pdf
和mytestuc.pdf
。
$ awk '{if(i)h=h$0} /^[0-9]+ [0-9]+ obj $/{i=1;h=""}/^stream$/{i=0;if(h!~/\/Image/)next;print h,":"NR+1}' test2uc.pdf
<</Width 176/BitsPerComponent 8/Interpolate true/Height 295/Filter /DCTDecode/Subtype /Image/Length 20003/ColorSpace /DeviceRGB/Type /XObject>>stream :113
przemoc@debian:~/latex/test/img/mod$ awk '{if(i)h=h$0} /^[0-9]+ [0-9]+ obj $/{i=1;h=""}/^stream$/{i=0;if(h!~/\/Image/)next;print h,":"NR+1}' mytestuc.pdf
<</DecodeParms <</Colors 3/Columns 176/Predictor 10/BitsPerComponent 8>>/Width 176/BitsPerComponent 8/Height 295/Filter /FlateDecode/Subtype /Image/Length 54954/ColorSpace /DeviceRGB/Type /XObject>>stream :22
在两种情况下,只有一个图像流。为什么会增加更多?!
$ sed '1,618d;/^endstream $/q' testuc.pdf | convert -depth 8 -size 707x4924 rgb:- testuc-stream1.png
$ sed '1,12105d;/^endstream $/q' testuc.pdf | convert -depth 8 -size 953x3940 rgb:- testuc-stream2.png
$ sed '1,12909d;/^endstream $/q' testuc.pdf | convert -depth 8 -size 953x984 rgb:- testuc-stream3.png
$ sed '1,18546d;/^endstream $/q' testuc.pdf | convert -depth 8 -size 953x3940 rgb:- testuc-stream4.png
$ sed '1,19311d;/^endstream $/q' testuc.pdf | convert -depth 8 -size 953x984 rgb:- testuc-stream5.png
$ sed '1,19325d;/^endstream $/q' testuc.pdf | convert -depth 8 -size 328x4924 rgb:- testuc-stream6.png
图像被切割成许多片段……看起来像是一种完全愚蠢的保护,也许是Distiller引入的(也许可以将其关闭)?我怀疑PDFCreator会吐出同样的东西,除非是Word造成这种令人难以置信的精神错乱...
testuc-stream1.png和其他(使用向右箭头导航)
结论
重要的事情是:
- 您可以清楚地看到,被切成碎片的巨大图像实际上是放大的JPEG,所以我的假设是正确的,
- 因为在PDFCreator中您还会在输出中获得巨大的文件,是Word为伪造的PDF打印机提供了巨大的图像,而我先前的假设也是正确的。
ew 这项调查花了一些时间。话是垃圾。
解决方法?
同时,提出了一些建议。让我评论一下。
使用像LibreOffice这样的具有体面的PDF支持的writer (忘记OpenOffice,现在已经过时了)是一个很好的解决方案,除非出现一些不兼容的情况使您无法使用它。
在页面上的同一框中使用较大的图像也不是什么坏主意,因为即使在进行JPEG缩放后,伪像也将不那么可见。
我的另一个错误是从一开始就使用JPEG。这样,Word不应重新压缩它(您永远不会知道...),并且可以提供最高质量的JPEG。还有无损JPEG压缩。雷蒙德(Redmond)的开发人员可能以为不需要它,因此,如果Word不处理此类JPEG,我不会感到惊讶。嗯,TBH并没有像算术编码那样得到广泛支持(即使在开源世界中也是如此)(或者在算术编码的情况下甚至更糟)。
convert test.png -quality 100 -resize $((100*300/72))% test-300dpi-mitchell.jpg
convert test.png -quality 100 -filter box -resize $((100*300/72))% test-300dpi-box.jpg
convert test.png -quality 100 test.jpg
(在Windows中使用416代替$(())
POSIX Shell中可用的此算术扩展)
我认为默认的Mitchell是升级的好选择,但是如果您真的想要这样的像素图像,请按照@ceving的建议使用Box。当然,仅当您必须(出于某种原因)使用假PDF打印机时,前两个文件才有用。
我已经上传了所有三个文件。
测试-300dpi的-mitchell.jpg(426 KB)
测试-300dpi的-box.jpg(581 KB)
test.jpg放在(74 KB)
如果我的假设是正确的,并且Word不会重新压缩JPEG图像,则只需使用最后一个未放大的图像,然后使用内置的PDF输出,因为它的缺点少(至少避免了不必要的放大)。