使用java中的itext更改现有pdf的UserUnit

时间:2014-11-12 16:08:30

标签: java pdf itext

我没有找到任何特定于该主题的内容,因此我使用此主板并希望得到问题/帮助。

我有什么:我有一个非常大的pdf文件(adobe读者说:21.399,4 x 15.123,7 mm,缩放工厂,打开时屏幕填充率约为1,64%!)。这是一张施工图,但这并不重要。当我使用sublime分析结构时,我可以找到以下内容:

  • pdf-版本是:1.6
  • CropBox [0.0 0.0 14400.0 10177.0]
  • / Rotate 0 / Type / Page / UserUnit 4.2125

我需要的是:一个较小的文件,由于尺寸大,我无法继续处理文件

我尝试过:使用iText将UserUnit缩减为默认值" 1"第一步。这应该会让事情变得更容易。我在java-programm中的代码如下所示:

PdfReader reader = new PdfReader(inFile.getAbsolutePath());
try (FileOutputStream outStream = new FileOutputStream(outFile)) {
    PdfStamper pdfStamper = new PdfStamper(reader, outStream);
    PdfWriter writer = pdfStamper.getWriter();
    writer.setUserunit(1f);
    pdfStamper.close();
}

我试过的另一件事是:

PdfDictionary pageDict;
pageDict = reader.getCatalog();
pageDict.put(PdfName.USERUNIT, new PdfNumber(1f));

这两件事都没有用,所以我的问题是:

  • 是否可以更改现有文件的UserUnits?或者我是否需要使用我想要的属性创建一个新的,然后在我的新内容中编写现有pdf的内容?
  • 如果可能的话:我还需要做些什么才能更改UserUnits?

来自海德堡的问候, 诚恳 D. Pfizenmaier

1 个答案:

答案 0 :(得分:0)

请查看ScaleRotate示例。它是在问题Rotating in Itextsharp while preserving comment location & orientation的回答中写的,您可以在其中找到有关用户单元的更多信息。

这是相关的代码:

PdfReader reader = new PdfReader(src);
int n = reader.getNumberOfPages();
PdfDictionary page;
for (int p = 1; p <= n; p++) {
    page = reader.getPageN(p);
    page.put(PdfName.USERUNIT, new PdfNumber(1f));
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
reader.close();

请注意,您使用getCatalog()获取文档的根目录,但是您为变量提供的名称听起来就好像您认为它是页面词典一样。那不会起作用......