openxml - 图像上忽略 DPI 设置

标签 openxml docx

我有一个.docx我一直在使用 OpenXML 处理的文档。我所做的任务之一是通过在原始文档中查找其大小并生成一个大小正确的新文档来替换图像。然而,在某些情况下并非如此。似乎 word 想要忽略我的 DPI 设置,但我不明白为什么。

示例,查看 XML,我有一个图像:

<wp:extent cx="4572000" cy="2971800" />

将 EMU 转换为我想要的像素 300 DPI,这应该给我尺寸 975 x1500像素(即 2971800 * 300 / 914400 = 9754572000 * 300 / 914400 = 1500 )。因此,我生成图像并将其推送到文档中代替原始图像。文档中的图片应该是3.25" x 5"但是,当我加载生成的文档并查看Word中的“大小和位置”时,它声称图像的原始大小为 10.16" x15.62"并缩小为 32%在两个维度上。文档中打包的图片确实是975 x1500我想要,但 Word 似乎将其视为 96 dpi (975/10.16 = 96)。所以我的问题是,为什么要这样做以及如何阻止它?我已在 BlipFill 上明确设置了 DPI ,但似乎被忽略了。

以下是 XML 文档中的整个内容:

<w:drawing xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="1D5F6FCE" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
    <wp:extent cx="4572000" cy="2971800" />
    <wp:effectExtent l="0" t="0" r="0" b="0" />
    <wp:docPr id="2" name="Picture 2" title="work" />
    <wp:cNvGraphicFramePr>
      <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1" />
    </wp:cNvGraphicFramePr>
    <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
      <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
        <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
          <pic:nvPicPr>
            <pic:cNvPr id="0" name="Picture 2" />
            <pic:cNvPicPr>
              <a:picLocks noChangeAspect="1" noChangeArrowheads="1" />
            </pic:cNvPicPr>
          </pic:nvPicPr>
          <pic:blipFill dpi="300">
            <a:blip r:embed="rId13" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
              <a:extLst>
                <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                  <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0" />
                </a:ext>
              </a:extLst>
            </a:blip>
            <a:srcRect />
            <a:stretch>
              <a:fillRect />
            </a:stretch>
          </pic:blipFill>
          <pic:spPr bwMode="auto">
            <a:xfrm>
              <a:off x="0" y="0" />
              <a:ext cx="4572000" cy="2971800" />
            </a:xfrm>
            <a:prstGeom prst="rect">
              <a:avLst />
            </a:prstGeom>
            <a:noFill />
          </pic:spPr>
        </pic:pic>
      </a:graphicData>
    </a:graphic>
  </wp:inline>
</w:drawing>

最佳答案

要生成您想要的原始尺寸值,我相信您需要将图像二进制文件中的 DPI 值设置为 300 dpi。

dpi <pic:blipFill> 上的属性您提到的似乎仅在打印过程中或在图像二进制文件没有 DPI 值时由 Word 使用。无论如何,它不用于计算文档中的图像显示尺寸。如果图像本身记录了 dpi 值,则 Word 很可能更喜欢存储在图像本身中的 dpi 值。这可能值得使用图像查看器或您拥有的任何其他方法进行检查。一般来说,图像dpi默认为72dpi。 96 是 Windows 下的系统“屏幕”dpi,这让我怀疑这是嵌入图像二进制文件中的 dpi,特别是如果它是由 Windows 应用程序生成的。

为了让图像在文档中以正确的尺寸显示,您需要的是 cx 和 cy 值。如果你设置<wp:extent/>中的那些到你想要的大小,这应该可以解决屏幕显示的问题。但是,如果您希望它也以正确的尺寸打印,您还需要更改 pic:spPr/a:xfrm/a:ext 中的内容。

从您的问题来看,它实际上以正确的尺寸显示,只是 Word 对话框中报告的原始尺寸不是预期值。我希望如果您获得图像中设置的实际图像 dpi 值,您将看到您所追求的行为。

关于openxml - 图像上忽略 DPI 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26660199/

相关文章:

c# - 如何在 C# 中从模板创建 *.docx 文件

java - 将 VBA 脚本添加到 Office Word 文档

python - 使用palantir代工厂中的存储库输出.docx文档

c# - 使用 C# 生成 Word 文档

c# - 在 OpenXml 复选框 word2013 中设置值

ms-word - Office Open XML`wrapPolygon`中`x`和`y`的含义和单位

node.js - 如何使用nodejs读取docx文件?

C# OpenXML Word - 如何创建 VBA 宏?

c# - 如何在 C# 中使用 OpenXML 更新所有字段(交叉引用)?

excel - VBA:Word将.docx文件保存为.doc文件,如何保存为docx?