|
24 | 24 | import org.apache.pdfbox.cos.COSDocument;
|
25 | 25 | import org.apache.pdfbox.cos.COSName;
|
26 | 26 | import org.apache.pdfbox.cos.COSObject;
|
| 27 | +import org.apache.pdfbox.cos.COSObjectKey; |
27 | 28 | import org.apache.pdfbox.io.IOUtils;
|
28 | 29 | import org.apache.pdfbox.pdmodel.PDDocument;
|
29 | 30 | import org.apache.pdfbox.pdmodel.PDDocumentInformation;
|
30 | 31 | import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
31 | 32 | import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
|
32 | 33 | import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
| 34 | +import org.apache.pdfbox.pdmodel.font.PDFont; |
| 35 | +import org.apache.pdfbox.pdmodel.font.PDType0Font; |
33 | 36 | import org.apache.pdfbox.pdmodel.interactive.action.PDActionGoTo;
|
34 | 37 | import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI;
|
35 | 38 | import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment;
|
|
44 | 47 | import org.apache.pdfbox.text.PDFTextStripper;
|
45 | 48 | import org.hamcrest.CustomTypeSafeMatcher;
|
46 | 49 | import org.junit.Assert;
|
| 50 | +import org.junit.BeforeClass; |
47 | 51 | import org.junit.Test;
|
48 | 52 |
|
49 | 53 | import com.openhtmltopdf.layout.Layer;
|
50 | 54 | import com.openhtmltopdf.outputdevice.helper.ExternalResourceControlPriority;
|
| 55 | +import com.openhtmltopdf.pdfboxout.PDFontSupplier; |
51 | 56 | import com.openhtmltopdf.pdfboxout.PagePosition;
|
52 | 57 | import com.openhtmltopdf.pdfboxout.PdfBoxRenderer;
|
53 | 58 | import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
|
|
61 | 66 | public class NonVisualRegressionTest {
|
62 | 67 | private static final String RES_PATH = "/visualtest/html/";
|
63 | 68 | private static final String OUT_PATH = "target/test/visual-tests/test-output/";
|
64 |
| - |
| 69 | + |
| 70 | + @BeforeClass |
| 71 | + public static void configureTests() throws IOException { |
| 72 | + TestSupport.makeFontFiles(); |
| 73 | + } |
| 74 | + |
65 | 75 | private static void render(String fileName, String html, BuilderConfig config) throws IOException {
|
66 | 76 | ByteArrayOutputStream actual = new ByteArrayOutputStream();
|
67 | 77 |
|
@@ -1169,6 +1179,56 @@ public void testIssue427GetBodyPagePositions() throws IOException {
|
1169 | 1179 | assertEquals(111.48, lastContentLine, 0.5);
|
1170 | 1180 | }
|
1171 | 1181 |
|
| 1182 | + /** |
| 1183 | + * Tests that it is possible to use a PDDocument multiple times |
| 1184 | + * without re-embedding required fonts. |
| 1185 | + * PR#684, Issue#683 |
| 1186 | + */ |
| 1187 | + @Test |
| 1188 | + public void testPr684FontReuse() throws IOException { |
| 1189 | + String html1 = loadHtml("pr-684-font-reuse-1"); |
| 1190 | + String html2 = loadHtml("pr-684-font-reuse-2"); |
| 1191 | + |
| 1192 | + try (PDDocument doc = new PDDocument()) { |
| 1193 | + PDFont font = PDType0Font.load(doc, TestSupport.fontFileKarlaBold()); |
| 1194 | + PDFontSupplier supplier = new PDFontSupplier(font); |
| 1195 | + |
| 1196 | + try (PdfBoxRenderer renderer = new PdfRendererBuilder() |
| 1197 | + .usePDDocument(doc) |
| 1198 | + .withHtmlContent(html1, null) |
| 1199 | + .useFont(supplier, "MyFont") |
| 1200 | + .buildPdfRenderer()) { |
| 1201 | + renderer.createPDFWithoutClosing(); |
| 1202 | + } |
| 1203 | + |
| 1204 | + try (PdfBoxRenderer renderer = new PdfRendererBuilder() |
| 1205 | + .usePDDocument(doc) |
| 1206 | + .withHtmlContent(html2, null) |
| 1207 | + .useFont(supplier, "MyFont") |
| 1208 | + .buildPdfRenderer()) { |
| 1209 | + renderer.createPDFWithoutClosing(); |
| 1210 | + } |
| 1211 | + |
| 1212 | + ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| 1213 | + doc.save(os); |
| 1214 | + writePdfToFile("pr-684-font-reuse", os); |
| 1215 | + } |
| 1216 | + |
| 1217 | + try (PDDocument doc = load("pr-684-font-reuse")) { |
| 1218 | + try (COSDocument cos = doc.getDocument()) { |
| 1219 | + COSName name1 = doc.getPage(0).getResources().getFontNames().iterator().next(); |
| 1220 | + COSName name2 = doc.getPage(1).getResources().getFontNames().iterator().next(); |
| 1221 | + |
| 1222 | + COSObjectKey fnt1 = cos.getKey(doc.getPage(0).getResources().getFont(name1).getCOSObject()); |
| 1223 | + COSObjectKey fnt2 = cos.getKey(doc.getPage(1).getResources().getFont(name2).getCOSObject()); |
| 1224 | + |
| 1225 | + assertEquals(fnt1, fnt2); |
| 1226 | + } |
| 1227 | + |
| 1228 | + remove("pr-684-font-reuse", doc); |
| 1229 | + } |
| 1230 | + } |
| 1231 | + |
1172 | 1232 | // TODO:
|
1173 | 1233 | // + More form controls.
|
1174 | 1234 | // + Custom meta info.
|
|
0 commit comments