【问题标题】:How can I convert a document to landscape mode using a Java library?如何使用 Java 库将文档转换为横向模式?
【发布时间】:2011-09-19 06:55:23
【问题描述】:

我正在用 Java 编写程序(我使用的是 Ubuntu)。我正在使用 Jodconverter 将文档转换为 PDF。我必须将文档转换为横向模式,但我读到 Jodconverter 不支持方向更改。我也尝试过使用 OpenOffice API,但我遇到了同样的问题。

是否有任何 Java 库可以转换为横向?

【问题讨论】:

    标签: java pdf-generation openoffice.org jodconverter openoffice-api


    【解决方案1】:

    来自关于将 Jodconverter 与 Open Office 文档一起使用的类似问题:

    http://groups.google.com/group/jodconverter/browse_thread/thread/dc96df64c7d60ada/c1692fee92513b7a

    简短的回答:你不能。页面方向是 文档(菜单格式 > Calc 中的页面),而不是 PDF 导出选项。所以 应该已经在 XLS 文档中设置。

    【讨论】:

      【解决方案2】:

      导出为 PDF,然后使用PDFbox 之类的 PDF 库将页面旋转 90 度。

      在所有页面上尝试PDPage.setRotation(int) (PDDocument.getDocumentCatalog().getAllPages())。

      【讨论】:

      • 我尝试了 PDFbox lib,但它只是旋转页面....但是我必须将页面的方向更改为横向,就像我们在横向模式下打印文档时一样。
      • 要改变“方向”,你需要改变页面的边界(试试PDPage.setMediaBox();如果失败,试试其他接受矩形的方法)。
      【解决方案3】:

      我找到了解决方案。我已经使用 Open Office API for java 将文档转换为横向 pdf。这是相同的代码。

      System.out.println("starting...");
                      String oooExeFolder = "/usr/lib/openoffice/program";
                      XComponentContext xContext = BootstrapSocketConnector.bootstrap(oooExeFolder);
      
                      XMultiComponentFactory xMCF = xContext.getServiceManager();
      
                      Object oDesktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
      
                      XComponentLoader xCLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, oDesktop);
                      System.out.println("loading ");
                      PropertyValue[] printerDesc = new PropertyValue[1];
                      printerDesc[0] = new PropertyValue();
                      printerDesc[0].Name = "PaperOrientation";
                      printerDesc[0].Value = PaperOrientation.LANDSCAPE;
                      // Create a document
                      XComponent document = xCLoader.loadComponentFromURL(loadUrl, "_blank", 0, printerDesc);
                      // Following property will convert doc into requested orientation.
                      XPrintable xPrintable = (XPrintable) UnoRuntime.queryInterface(XPrintable.class, document);
                      xPrintable.setPrinter(printerDesc);
                      PropertyValue[] conversionProperties = new PropertyValue[3];
                      conversionProperties[1] = new PropertyValue();
                      conversionProperties[1].Name = "FilterName";
                      conversionProperties[1].Value = "writer_pdf_Export";// 
                      conversionProperties[0] = new PropertyValue();
                      conversionProperties[0].Name = "Overwrite ";
                      conversionProperties[0].Value = new Boolean(true);
                      System.out.println("closing");
                      XStorable xstorable = (XStorable) UnoRuntime.queryInterface(XStorable.class, document);
                      xstorable.storeToURL(storeUrl, conversionProperties);
                      System.out.println("closing");
                      XCloseable xcloseable = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, document);
                      xcloseable.close(false);
      

      【讨论】:

        【解决方案4】:

        尝试覆盖OfficeDocumentConverter

        OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager) {
        
                    private Map<String, Object> createDefaultLoadProperties() {
                        Map<String, Object> loadProperties = new HashMap<String, Object>();
                        loadProperties.put("Hidden", true);
                        loadProperties.put("ReadOnly", true);
                        loadProperties.put("UpdateDocMode", UpdateDocMode.QUIET_UPDATE);
                        return loadProperties;
                    }
        
                    @Override
                    public void convert(File inputFile, File outputFile, DocumentFormat outputFormat) throws OfficeException {
                        String inputExtension = FilenameUtils.getExtension(inputFile.getName());
                        DocumentFormat inputFormat = getFormatRegistry().getFormatByExtension(inputExtension);
                        inputFormat.setLoadProperties(Collections.singletonMap("PaperOrientation", PaperOrientation.LANDSCAPE));
                        StandardConversionTask conversionTask = new StandardConversionTask(inputFile, outputFile, outputFormat) {
        
                            @Override
                            protected void modifyDocument(XComponent document) throws OfficeException {
                                PropertyValue[] printerDesc = OfficeUtils.toUnoProperties(Collections.singletonMap("PaperOrientation", PaperOrientation.LANDSCAPE));
                                XPrintable xPrintable = cast(XPrintable.class, document);
                                try {
                                    xPrintable.setPrinter(printerDesc);
                                } catch (com.sun.star.lang.IllegalArgumentException e) {
                                    logger.error(e.getMessage());
                                }
                                super.modifyDocument(document);
                            }
                        };
                        conversionTask.setDefaultLoadProperties(createDefaultLoadProperties());
                        conversionTask.setInputFormat(inputFormat);
                        officeManager.execute(conversionTask);
                    }
        
                };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-11
          • 1970-01-01
          • 2021-11-07
          • 2012-09-23
          • 1970-01-01
          • 2013-06-26
          • 1970-01-01
          相关资源
          最近更新 更多