diff options
author | Svetoslav <svetoslavganov@google.com> | 2014-09-10 00:49:17 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-09-10 00:49:17 +0000 |
commit | 87c8260341a54dbaa7a26eb81a40f65688c3ed36 (patch) | |
tree | 000cae7e91e5602557bf04b4bcab382f2e1eb705 /graphics/java | |
parent | 884698e380c32f66f3bd59a87f01ca25329172d6 (diff) | |
parent | 08dd15e1f416e83cb092c725f5501ebf6220bc0a (diff) | |
download | frameworks_base-87c8260341a54dbaa7a26eb81a40f65688c3ed36.zip frameworks_base-87c8260341a54dbaa7a26eb81a40f65688c3ed36.tar.gz frameworks_base-87c8260341a54dbaa7a26eb81a40f65688c3ed36.tar.bz2 |
am f1b72b86: am 3f49b128: Merge "Trim unnecessary pages when printing." into lmp-dev
* commit 'f1b72b86380b25b933be32c46d4f59a41699a546':
Trim unnecessary pages when printing.
Diffstat (limited to 'graphics/java')
-rw-r--r-- | graphics/java/android/graphics/pdf/PdfEditor.java | 162 | ||||
-rw-r--r-- | graphics/java/android/graphics/pdf/PdfRenderer.java | 2 |
2 files changed, 163 insertions, 1 deletions
diff --git a/graphics/java/android/graphics/pdf/PdfEditor.java b/graphics/java/android/graphics/pdf/PdfEditor.java new file mode 100644 index 0000000..9837139 --- /dev/null +++ b/graphics/java/android/graphics/pdf/PdfEditor.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.graphics.pdf; + +import android.annotation.NonNull; +import android.os.ParcelFileDescriptor; +import android.system.ErrnoException; +import android.system.OsConstants; +import dalvik.system.CloseGuard; +import libcore.io.IoUtils; +import libcore.io.Libcore; + +import java.io.IOException; + +/** + * Class for editing PDF files. + * + * @hide + */ +public final class PdfEditor { + + private final CloseGuard mCloseGuard = CloseGuard.get(); + + private final long mNativeDocument; + + private int mPageCount; + + private ParcelFileDescriptor mInput; + + /** + * Creates a new instance. + * <p> + * <strong>Note:</strong> The provided file descriptor must be <strong>seekable</strong>, + * i.e. its data being randomly accessed, e.g. pointing to a file. After finishing + * with this class you must call {@link #close()}. + * </p> + * <p> + * <strong>Note:</strong> This class takes ownership of the passed in file descriptor + * and is responsible for closing it when the editor is closed. + * </p> + * + * @param input Seekable file descriptor to read from. + * + * @see #close() + */ + public PdfEditor(@NonNull ParcelFileDescriptor input) throws IOException { + if (input == null) { + throw new NullPointerException("input cannot be null"); + } + + final long size; + try { + Libcore.os.lseek(input.getFileDescriptor(), 0, OsConstants.SEEK_SET); + size = Libcore.os.fstat(input.getFileDescriptor()).st_size; + } catch (ErrnoException ee) { + throw new IllegalArgumentException("file descriptor not seekable"); + } + + mInput = input; + mNativeDocument = nativeOpen(mInput.getFd(), size); + mPageCount = nativeGetPageCount(mNativeDocument); + mCloseGuard.open("close"); + } + + /** + * Gets the number of pages in the document. + * + * @return The page count. + */ + public int getPageCount() { + throwIfClosed(); + return mPageCount; + } + + /** + * Removes the page with a given index. + * + * @param pageIndex The page to remove. + */ + public void removePage(int pageIndex) { + throwIfClosed(); + throwIfPageNotInDocument(pageIndex); + mPageCount = nativeRemovePage(mNativeDocument, pageIndex); + } + + /** + * Writes the PDF file to the provided destination. + * <p> + * <strong>Note:</strong> This method takes ownership of the passed in file + * descriptor and is responsible for closing it when writing completes. + * </p> + * @param output The destination. + */ + public void write(ParcelFileDescriptor output) throws IOException { + try { + throwIfClosed(); + nativeWrite(mNativeDocument, output.getFd()); + } finally { + IoUtils.closeQuietly(output); + } + } + + /** + * Closes this editor. You should not use this instance + * after this method is called. + */ + public void close() { + throwIfClosed(); + doClose(); + } + + @Override + protected void finalize() throws Throwable { + try { + mCloseGuard.warnIfOpen(); + if (mInput != null) { + doClose(); + } + } finally { + super.finalize(); + } + } + + private void doClose() { + nativeClose(mNativeDocument); + IoUtils.closeQuietly(mInput); + mInput = null; + mCloseGuard.close(); + } + + private void throwIfClosed() { + if (mInput == null) { + throw new IllegalStateException("Already closed"); + } + } + + private void throwIfPageNotInDocument(int pageIndex) { + if (pageIndex < 0 || pageIndex >= mPageCount) { + throw new IllegalArgumentException("Invalid page index"); + } + } + + private static native long nativeOpen(int fd, long size); + private static native void nativeClose(long documentPtr); + private static native int nativeGetPageCount(long documentPtr); + private static native int nativeRemovePage(long documentPtr, int pageIndex); + private static native void nativeWrite(long documentPtr, int fd); +} diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index 1072b3c..359c294 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -239,7 +239,7 @@ public final class PdfRenderer implements AutoCloseable { } private void throwIfPageNotInDocument(int pageIndex) { - if (pageIndex >= mPageCount) { + if (pageIndex < 0 || pageIndex >= mPageCount) { throw new IllegalArgumentException("Invalid page index"); } } |