/* CHAPTER 11. Document Information and Metadata */

/** Finds out if a document is linearized as quickly as possible without
loading it. */
public boolean isLinearized(String filename) throws CpdfError;

/** Returns the minor version number of a document. */
public native int getVersion(Pdf pdf) throws CpdfError;

/** Returns the major version number of a document. */
public native int getMajorVersion(Pdf pdf) throws CpdfError;

/** Returns the title of a document. */
public String getTitle(Pdf pdf) throws CpdfError;

/** Returns the author of a document. */
public String getAuthor(Pdf pdf) throws CpdfError;

/** Returns the subject of a document. */
public String getSubject(Pdf pdf) throws CpdfError;

/** Returns the keywords of a document. */
public String getKeywords(Pdf pdf) throws CpdfError;

/** Returns the creator of a document. */
public String getCreator(Pdf pdf) throws CpdfError;

/** Returns the producer of a document. */
public String getProducer(Pdf pdf) throws CpdfError;

/** Returns the creation date of a document. */
public String getCreationDate(Pdf pdf) throws CpdfError;

/** Returns the modification date of a document. */
public String getModificationDate(Pdf pdf) throws CpdfError;

/** Returns the XMP title of a document. */
public String getTitleXMP(Pdf pdf) throws CpdfError;

/** Returns the XMP author of a document. */
public String getAuthorXMP(Pdf pdf) throws CpdfError;

/** Returns the XMP subject of a document. */
public String getSubjectXMP(Pdf pdf) throws CpdfError;

/** Returns the XMP keywords of a document. */
public String getKeywordsXMP(Pdf pdf) throws CpdfError;

/** Returns the XMP creator of a document. */
public String getCreatorXMP(Pdf pdf) throws CpdfError;

/** Returns the XMP producer of a document. */
public String getProducerXMP(Pdf pdf) throws CpdfError;

/** Returns the XMP creation date of a document. */
public String getCreationDateXMP(Pdf pdf) throws CpdfError;

/** Returns the XMP modification date of a document. */
public String getModificationDateXMP(Pdf pdf) throws CpdfError;

/** Sets the title of a document. */
public void setTitle(Pdf pdf, String str) throws CpdfError;

/** Sets the author of a document. */
public void setAuthor(Pdf pdf, String str) throws CpdfError;

/** Sets the subject of a document. */
public void setSubject(Pdf pdf, String str) throws CpdfError;

/** Sets the keywords of a document. */
public void setKeywords(Pdf pdf, String str) throws CpdfError;

/** Sets the creator of a document. */
public void setCreator(Pdf pdf, String str) throws CpdfError;

/** Sets the producer of a document. */
public void setProducer(Pdf pdf, String str) throws CpdfError;

/** Sets the creation date of a document. */
public void setCreationDate(Pdf pdf, String str) throws CpdfError;

/** Sets the modification date of a document. */
public void setModificationDate(Pdf pdf, String str) throws CpdfError;

/** Sets the XMP title of a document. */
public void setTitleXMP(Pdf pdf, String str) throws CpdfError;

/** Sets the XMP author of a document. */
public void setAuthorXMP(Pdf pdf, String str) throws CpdfError;

/** Sets the XMP subject of a document. */
public void setSubjectXMP(Pdf pdf, String str) throws CpdfError;

/** Sets the XMP keywords of a document. */
public void setKeywordsXMP(Pdf pdf, String str) throws CpdfError;

/** Sets the XMP creator of a document. */
public void setCreatorXMP(Pdf pdf, String str) throws CpdfError;

/** Sets the XMP producer of a document. */
public void setProducerXMP(Pdf pdf, String str) throws CpdfError;

/** Sets the XMP creation date of a document. */
public void setCreationDateXMP(Pdf pdf, String str) throws CpdfError;

/** Sets the XMP modification date of a document. */
public void setModificationDateXMP(Pdf pdf, String str) throws CpdfError;

/** Returns the components from a PDF date string in an array of length 8.
@param datestring date string
@param r return array */
public native void getDateComponents(String datestring, int[] r)
    throws CpdfError;

/** Builds a PDF date string from individual components. */
public native String dateStringOfComponents(int year, int month, int day,
                                            int hour, int minute,
                                            int second, int hour_offset,
                                            int minute_offset)
    throws CpdfError;

/** Gets the viewing rotation for a given page. */
public native int getPageRotation(Pdf pdf, int pagenumber)
    throws CpdfError;

/** Returns <code>true</code> if the given page has the given box. E.g
"/CropBox".
@param pdf PDF document
@param pagenumber page number
@param boxname box name, e.g "/CropBox" */
public native boolean hasBox(Pdf pdf, int pagenumber, String boxname)
    throws CpdfError;

/** These functions get a box given the document. The values are returned
in a given array of length 4: min x, max x, min y, max y in points. Only
succeeds if such a box exists, as checked by {@link #hasBox(Pdf, int,
String) hasBox}. */
public native void getMediaBox(Pdf pdf, int pagenumber, double[] r)
    throws CpdfError;

public native void getCropBox(Pdf pdf, int pagenumber, double[] r)
    throws CpdfError;

public native void getBleedBox(Pdf pdf, int pagenumber, double[] r)
    throws CpdfError;

public native void getArtBox(Pdf pdf, int pagenumber, double[] r)
    throws CpdfError;

public native void getTrimBox(Pdf pdf, int pagenumber, double[] r)
    throws CpdfError;

/** These functions set a box given the document page range, min x, max x,
min y, max y in points. */
public native void setMediabox(Pdf pdf, Range range, double minx,
                               double maxx, double miny, double maxy)
    throws CpdfError;

public native void setCropBox(Pdf pdf, Range range, double minx,
                              double maxx, double miny, double maxy)
    throws CpdfError;

public native void setTrimBox(Pdf pdf, Range range, double minx,
                              double maxx, double miny, double maxy)
    throws CpdfError;

public native void setArtBox(Pdf pdf, Range range, double minx,
                             double maxx, double miny, double maxy)
    throws CpdfError;

public native void setBleedBox(Pdf pdf, Range range, double minx,
                               double maxx, double miny, double maxy)
    throws CpdfError;

/** Marks a document as trapped. */
public native void markTrapped(Pdf pdf) throws CpdfError;

/** Marks a document as untrapped. */
public native void markUntrapped(Pdf pdf) throws CpdfError;

/** Marks a document as trapped in XMP metadata. */
public native void markTrappedXMP(Pdf pdf) throws CpdfError;

/** Marks a document as untrapped in XMP metadata. */
public native void markUntrappedXMP(Pdf pdf) throws CpdfError;

/** Sets the page layout for a document, such as {@link #singlePage
singlePage} */
public native void setPageLayout(Pdf pdf, int layout) throws CpdfError;

/** Sets the page mode for a document, such as {@link #useNone useNone} */
public native void setPageMode(Pdf pdf, int mode) throws CpdfError;

/** Sets the hide toolbar flag. */
public native void hideToolbar(Pdf pdf, boolean flag) throws CpdfError;

/** Sets the hide menubar flag. */
public native void hideMenubar(Pdf pdf, boolean flag) throws CpdfError;

/** Sets the hide window UI flag. */
public native void hideWindowUi(Pdf pdf, boolean flag) throws CpdfError;

/** Sets the fit window flag. */
public native void fitWindow(Pdf pdf, boolean flag) throws CpdfError;

/** Sets the center window flag. */
public native void centerWindow(Pdf pdf, boolean flag) throws CpdfError;

/** Sets the display document title flag. */
public native void displayDocTitle(Pdf pdf, boolean flag) throws CpdfError;

/** Sets the PDF to open, possibly with zoom-to-fit, at the given page
number.
@param pdf PDF document
@param fit if <code>true</code> zoom to fit
@param pagenumber page number */
public native void openAtPage(Pdf pdf, boolean fit, int pagenumber)
    throws CpdfError;

/** Sets the XMP metadata of a document, given a file name. */
public void setMetadataFromFile(Pdf pdf, String filename) throws CpdfError;

/** Sets the XMP metadata from an array of bytes. */
public native void setMetadataFromByteArray(Pdf pdf, byte[] data)
    throws CpdfError;

/** Removes the XMP metadata from a document. */
public native void removeMetadata(Pdf pdf) throws CpdfError;

/** Returns the XMP metadata from a document. */
public native byte[] getMetadata(Pdf pdf) throws CpdfError;

/** Builds fresh XMP metadata as best it can from
existing metadata in the document. */
public native void createMetadata(Pdf pdf) throws CpdfError;

/** Sets the metadata date for a PDF. The date is given in PDF date format.
Jcpdf will convert it to XMP format. The date "now" means now. */
public native void setMetadataDate(Pdf pdf, String date) throws CpdfError;

/** Adds page labels to a document.
@param pdf PDF document
@param style label style, such as {@link #decimalArabic decimalArabic}
@param prefix text for each label
@param offset can be used to shift the numbering up or down
@param range page range
@param progress if <code>true</code>, labels progress */
public void addPageLabels(Pdf pdf, int style, String prefix, int offset,
                          Range range, boolean progress)
    throws CpdfError

/** Removes the page labels from the document. */
public native void removePageLabels(Pdf pdf) throws CpdfError;

/** Calculates the full label string for a given page, and returns it. */
public String getPageLabelStringForPage(Pdf pdf, int pagenumber)
    throws CpdfError

/** Gets page label data. Call {@link #startGetPageLabels(Pdf)
startGetPageLabels} to find out how many there are, then use these serial
numbers to get the style, prefix, offset and start value (note not a
range). Call {@link #endGetPageLabels() endGetPageLabels} to clean up.

<p>For example, a document might have five pages of introduction with roman
numerals, followed by the rest of the pages in decimal arabic, numbered
from one:

<p>labelstyle = LowercaseRoman<br/>
labelprefix = ""<br/>
startpage = 1<br/>
startvalue = 1<br/>

<p>labelstyle = DecimalArabic<br/>
labelprefix = ""<br/>
startpage = 6<br/>
startvalue = 1<br> */
public native int startGetPageLabels(Pdf pdf) throws CpdfError;

public native void endGetPageLabels() throws CpdfError;

public native int getPageLabelOffset(int n) throws CpdfError;

public native int getPageLabelStyle(int n) throws CpdfError;

public native int getPageLabelRange(int n) throws CpdfError;

public String getPageLabelPrefix(int n) throws CpdfError;
