保护PDF

时间:2015-12-03 12:04:38

标签: java pdf apache-fop

我目前正在使用Apache FOP库来生成PDF文件。我希望这些PDF不受复制粘贴的影响,因此人们必须使用实际的OCR库(或手动输入)来获取有关PDF的信息。

FOP显然提供了一些安全性,然后将其作为meta-data添加到PDF上,以防止打印或复制等内容,但这似乎无法正常工作(无法禁用)启用打印时的复制粘贴等。)

对我来说似乎很简单的可能性基本上是以某种方式将PDF上的所有文本转换为图像,但我无法找到有关此事的任何信息。

显然,我不在乎PDF是否可以搜索。我只是想阻止人们复制粘贴,而他们仍然可以打印它。

我目前的FOP代码:

private static FopFactory fopFactory;

private static FopFactory initializeFactory() throws IOException,
        SAXException {
    if (fopFactory == null) {
        File f = new File(SettingUtil.getSetting(LetterGeneratorSettings.FOP_CONFIG_LOCATION));
        fopFactory = FopFactory.newInstance(f);
    }
    return fopFactory;
}

public static File generatePDFFromXML(File fopTemplate, File xmlSource,
        File resultFileLocation) throws IOException {
    try {
        initializeFactory();
        URL url = fopTemplate.toURI().toURL();
        // creation of transform source
        StreamSource transformSource = new StreamSource(url.openStream());
        // create an instance of fop factory

        // a user agent is needed for transformation
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
        foUserAgent.getRendererOptions().put("encryption-params",
                getEncryptionParams());
        // to store output
        ByteArrayOutputStream pdfoutStream = new ByteArrayOutputStream();
        StreamSource source = new StreamSource(new ByteArrayInputStream(IOUtils.toByteArray(new FileInputStream(xmlSource))));
        Transformer xslfoTransformer;
        try {
            TransformerFactory transfact = TransformerFactory.newInstance();

            xslfoTransformer = transfact.newTransformer(transformSource);
            // Construct fop with desired output format
            Fop fop;
            try {
                fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, pdfoutStream);
                // Resulting SAX events (the generated FO)
                // must be piped through to FOP
                Result res = new SAXResult(fop.getDefaultHandler());

                // Start XSLT transformation and FOP processing
                try {
                    // everything will happen here..
                    xslfoTransformer.transform(source, res);

                    // if you want to save PDF file use the following code
                    OutputStream out = new java.io.FileOutputStream(resultFileLocation);
                    out = new java.io.BufferedOutputStream(out);
                    FileOutputStream str = new FileOutputStream(resultFileLocation);
                    str.write(pdfoutStream.toByteArray());
                    str.close();
                    out.close();

                } catch (TransformerException e) {
                    e.printStackTrace();
                }
            } catch (FOPException e) {
                e.printStackTrace();
            }
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerFactoryConfigurationError e) {
            e.printStackTrace();
        }
        return resultFileLocation;
    } catch (Exception ex) {
        throw new IOException(ex);
    }
}

private static PDFEncryptionParams getEncryptionParams() {
    return new PDFEncryptionParams(null,
            SettingUtil.getSetting(LetterGeneratorSettings.PDF_PASSWORD),
            true, false, false, false, false);
}

以下是我的 fopconfig.xml

的内容
    <fop version="1.0">

  <!-- Strict user configuration -->
  <strict-configuration>false</strict-configuration>

  <!-- Strict FO validation -->
  <strict-validation>false</strict-validation>

  <!-- Base URL for resolving relative URLs -->
  <base>./</base>

  <!-- Font Base URL for resolving relative font URLs -->
  <font-base>./</font-base>

  <!-- Source resolution in dpi (dots/pixels per inch) for determining the size of pixels in SVG and bitmap images, default: 72dpi -->
  <source-resolution>72</source-resolution>
  <!-- Target resolution in dpi (dots/pixels per inch) for specifying the target resolution for generated bitmaps, default: 72dpi -->
  <target-resolution>72</target-resolution>

  <!-- default page-height and page-width, in case
       value is specified as auto -->
  <default-page-settings height="11in" width="8.26in"/>

  <!-- etc. etc..... -->
</fop>

1 个答案:

答案 0 :(得分:0)

我不确定它如何与Apache FOP一起使用,但使用iText lib非常容易。

这是我前一段时间写过关于这个http://tutors4all.net/index.php/2015/05/06/encrypt-pdf-file/

的教程