Skip to content

Commit

Permalink
Merge pull request #297 from metanorma/pdf_ua1
Browse files Browse the repository at this point in the history
PDF UA1
  • Loading branch information
Intelligent2013 authored Sep 29, 2024
2 parents 542f5c9 + 1689f35 commit e9ce6f2
Show file tree
Hide file tree
Showing 10 changed files with 548 additions and 11 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SHELL ?= /bin/bash
endif

#JAR_VERSION := $(shell mvn -q -Dexec.executable="echo" -Dexec.args='$${project.version}' --non-recursive exec:exec -DforceStdout)
JAR_VERSION := 2.01
JAR_VERSION := 2.02
JAR_FILE := mn2pdf-$(JAR_VERSION).jar

all: target/$(JAR_FILE)
Expand Down
10 changes: 5 additions & 5 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ You will need the Java Development Kit (JDK) version 8, Update 241 (8u241) or hi

[source,sh]
----
java -Xss5m -Xmx2048m -jar target/mn2pdf-2.01.jar --xml-file <XML-FileName> --xsl-file <XSLT-FileName> --pdf-file <Output-PDF-FileName> [--syntax-highlight]
java -Xss5m -Xmx2048m -jar target/mn2pdf-2.02.jar --xml-file <XML-FileName> --xsl-file <XSLT-FileName> --pdf-file <Output-PDF-FileName> [--syntax-highlight]
----

e.g.

[source,sh]
----
java -Xss5m -Xmx2048m -jar target/mn2pdf-2.01.jar --xml-file tests/G.191.xml --xsl-file tests/itu.recommendation.xsl --pdf-file tests/G.191.pdf
java -Xss5m -Xmx2048m -jar target/mn2pdf-2.02.jar --xml-file tests/G.191.xml --xsl-file tests/itu.recommendation.xsl --pdf-file tests/G.191.pdf
----

=== PDF encryption features
Expand Down Expand Up @@ -100,7 +100,7 @@ Update version in `pom.xml`, e.g.:
----
<groupId>org.metanorma.fop</groupId>
<artifactId>mn2pdf</artifactId>
<version>2.01</version>
<version>2.02</version>
<name>Metanorma XML to PDF converter</name>
----

Expand All @@ -111,8 +111,8 @@ Tag the same version in Git:

[source,xml]
----
git tag v2.01
git push origin v2.01
git tag v2.02
git push origin v2.02
----

Then the corresponding GitHub release will be automatically created at:
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.metanorma.fop</groupId>
<artifactId>mn2pdf</artifactId>
<version>2.01</version>
<version>2.02</version>
<name>Metanorma XML to PDF converter</name>
<packaging>jar</packaging>
<url>https://www.metanorma.org</url>
Expand Down
214 changes: 214 additions & 0 deletions src/main/java/org/apache/fop/pdf/PDFGoTo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/

/* $Id$ */

package org.apache.fop.pdf;

import java.awt.geom.Point2D;

/**
* class representing a /GoTo object.
* This can either have a Goto to a page reference and location
* or to a specified PDF reference string.
*/
public class PDFGoTo extends PDFAction {

/**
* the pageReference
*/
private PDFReference pageReference;
private String destination;
private float xPosition;
private float yPosition;
private boolean isNamedDestination;
private String contents;
/**
* create a /GoTo object.
*
* @param destination name of the destination
* @param isNamedDestination set to true if the destination is a named destination
*/
public PDFGoTo(String destination, boolean isNamedDestination) {
super();
this.destination = destination;
this.isNamedDestination = isNamedDestination;
}

/**
* create a /GoTo object.
*
* @param pageReference the pageReference represented by this object
*/
public PDFGoTo(String pageReference) {
super();
if (pageReference != null) {
setPageReference(new PDFReference(pageReference));
}
}

/**
* create a /GoTo object.
*
* @param pageReference the PDF reference to the target page
* @param position the target area's on-page coordinates in points
*/
public PDFGoTo(String pageReference, Point2D position) {
/* generic creation of object */
this(pageReference);
setPosition(position);
}

/**
* Sets page reference after object has been created
*
* @param pageReference the new page reference to use
*/
public void setPageReference(PDFReference pageReference) {
this.pageReference = pageReference;
}

/**
* Sets the target (X,Y) position
*
* @param position the target's on-page coordinates in points
*/
public void setPosition(Point2D position) {
this.xPosition = (float) position.getX();
this.yPosition = (float) position.getY();
}

/**
* Sets the x Position to jump to
*
* @param xPosition x position
*/
public void setXPosition(float xPosition) {
this.xPosition = xPosition;
}

/**
* Sets the Y position to jump to
*
* @param yPosition y position
*/
public void setYPosition(float yPosition) {
this.yPosition = yPosition;
}

/**
* Set the destination string for this Goto.
*
* @param dest the PDF destination string
*/
public void setDestination(String dest) {
destination = dest;
}

/**
* Set the Contents key string for this Goto.
*
* @param str the PDF Contents key string
*/
public void setContents(String str) {
contents = str;
}

/**
* Get the Contents key string for the GoTo action.
*
* @return the Contents key string for the action
*/
public String getContents() {
return contents;
}

/**
* Get the PDF reference for the GoTo action.
*
* @return the PDF reference for the action
*/
public String getAction() {
return referencePDF();
}

/**
* {@inheritDoc}
*/
public String toPDFString() {
String dest;
if (destination == null) {
dest = "/D [" + this.pageReference + " /XYZ " + xPosition
+ " " + yPosition + " null]\n";
} else {
dest = "/D [" + this.pageReference + " " + destination + "]\n";
if (this.isNamedDestination) {
dest = "/D (" + this.destination + ")\n";
} else {
dest = "/D [" + this.pageReference + " " + destination + "]\n";
}
}
return "<< /Type /Action\n/S /GoTo\n" + dest + ">>";
}

/*
* example
* 29 0 obj
* <<
* /S /GoTo
* /D [23 0 R /FitH 600]
* >>
* endobj
*/

/** {@inheritDoc} */
protected boolean contentEquals(PDFObject obj) {
if (this == obj) {
return true;
}

if (obj == null || !(obj instanceof PDFGoTo)) {
return false;
}

PDFGoTo gt = (PDFGoTo)obj;

if (gt.pageReference == null) {
if (pageReference != null) {
return false;
}
} else {
if (!gt.pageReference.equals(pageReference)) {
return false;
}
}

if (destination == null) {
if (!(gt.destination == null && gt.xPosition == xPosition
&& gt.yPosition == yPosition)) {
return false;
}
} else {
if (!destination.equals(gt.destination)) {
return false;
}
}

return (isNamedDestination == gt.isNamedDestination);
}
}

23 changes: 23 additions & 0 deletions src/main/java/org/apache/fop/pdf/PDFLink.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,36 @@ public String toPDFString() {
f |= 1 << (5 - 1); //NoRotate, bit 5
fFlag = "/F " + f;
}
String contents_key = null;
if (this.action instanceof PDFUri) {
PDFUri pdfUri = (PDFUri) this.action;
String uri = pdfUri.getUri();
if (uri != null && !uri.isEmpty()) {
if (uri.startsWith("(")) {
uri = uri.substring(1, uri.length() - 1);
}
if (uri.startsWith("mailto:")) {
uri = uri.substring(uri.indexOf("mailto:") + 7);
uri = "Email " + uri;
}
contents_key = "(" + uri + ")";
}
} else if (this.action instanceof PDFGoTo) {
PDFGoTo pdfGoto = (PDFGoTo) this.action;
String pdfGotoContents = pdfGoto.getContents();
if (pdfGotoContents != null && !pdfGotoContents.isEmpty()) {
contents_key = "(" + pdfGoto.getContents() + ")";
}
}
String s = "<< /Type /Annot\n" + "/Subtype /Link\n" + "/Rect [ "
+ (ulx) + " " + (uly) + " "
+ (brx) + " " + (bry) + " ]\n" + "/C [ "
+ this.color + " ]\n" + "/Border [ 0 0 0 ]\n" + "/A "
+ this.action.getAction() + "\n" + "/H /I\n"
+ (this.structParent != null
? "/StructParent " + this.structParent.toString() + "\n" : "")
+ (contents_key != null && !contents_key.isEmpty()
? "/Contents " + contents_key + "\n" : "")
+ fFlag + "\n>>";

if (this.action instanceof PDFFileAttachmentAnnotation) {
Expand Down
64 changes: 64 additions & 0 deletions src/main/java/org/apache/fop/pdf/PDFUri.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/

/* $Id$ */

package org.apache.fop.pdf;

/**
* class used to create a PDF Uri link
*/
public class PDFUri extends PDFAction {

private String uri;

/**
* create a Uri instance.
*
* @param uri the uri to which the link should point
*/
public PDFUri(String uri) {
this.uri = uri;
}

/**
* returns the action ncecessary for a uri
*
* @return the action to place next to /A within a Link
*/
public String getAction() {
if (hasObjectNumber()) {
return referencePDF();
} else {
return getDictString();
}
}

private String getDictString() {
return "<< /URI " + encodeScript(uri) + "\n/S /URI >>";
}

public String getUri() {
return PDFText.escapeText(uri, false);
}

/** {@inheritDoc} */
public String toPDFString() {
//TODO Convert this class into a dictionary
return getDictString();
}
}
Loading

0 comments on commit e9ce6f2

Please sign in to comment.