Upload index.html with huggingface_hub
Browse files- index.html +253 -17
index.html
CHANGED
|
@@ -1,19 +1,255 @@
|
|
| 1 |
<!doctype html>
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</html>
|
|
|
|
| 1 |
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
| 6 |
+
<title>IText AGPL Migration — find itext dependencies and replacements</title>
|
| 7 |
+
<meta name="description" content="This free browser tool finds iText dependencies and shows replacement dependency lines for OpenPDF or Apache PDFBox.">
|
| 8 |
+
<style>
|
| 9 |
+
:root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512}
|
| 10 |
+
.wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px}
|
| 11 |
+
textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box}
|
| 12 |
+
.bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer}
|
| 13 |
+
input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px}
|
| 14 |
+
table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65}
|
| 15 |
+
.sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600}
|
| 16 |
+
.note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa}
|
| 17 |
+
</style>
|
| 18 |
+
<script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script>
|
| 19 |
+
<!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/openpdf-migration-check"><style data-yj-mfit="1">#out{max-width:100%}#out td,#out th{overflow-wrap:anywhere}#out pre,#out code{white-space:pre-wrap;overflow-wrap:anywhere}@media (max-width:640px){table{display:block;max-width:100%;overflow-x:auto}pre{max-width:100%;overflow-x:auto}code,a{overflow-wrap:anywhere}img,svg,video,canvas,iframe{max-width:100%}textarea,input,select{max-width:100%;box-sizing:border-box}.yj-lgbar{position:static!important;justify-content:flex-end;margin:0 0 10px}h1,h2,h3,h4,p,li,dd,dt,blockquote,figcaption,summary,label,.res,.lead{overflow-wrap:anywhere}label{max-width:100%;box-sizing:border-box}#out table:not(:has(tr>:nth-child(4))){display:table;table-layout:fixed;width:100%}#out table:has(tr>:nth-child(4)),#out table:has(tr>:nth-child(4)) tbody,#out table:has(tr>:nth-child(4)) tr,#out table:has(tr>:nth-child(4)) td{display:block;width:auto;overflow:visible}#out table:has(tr>:nth-child(4)) thead{display:none}#out table:has(tr>:nth-child(4)) tr{padding:10px 0;border-bottom:1px solid rgba(128,128,128,.28)}#out table:has(tr>:nth-child(4)) td{border:0;padding:1px 0}#out table:has(tr>:nth-child(4)) td:nth-child(-n+3){display:inline-block;margin-right:10px;font-size:12px;opacity:.78}}</style>
|
| 20 |
+
</head>
|
| 21 |
+
<body>
|
| 22 |
+
<div class="wrap">
|
| 23 |
+
<h1>IText AGPL Migration — find itext dependencies and replacements</h1>
|
| 24 |
+
<p class="lede">Finds every iText (AGPLv3) dependency in pom.xml and build.gradle with file and line, and gives the exact OpenPDF 3.0.5 or Apache PDFBox 3.0.8 line that replaces it. Runs entirely in your browser — nothing is uploaded.</p>
|
| 25 |
+
<textarea id="src" spellcheck="false"><?xml version="1.0" encoding="UTF-8"?>
|
| 26 |
+
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
| 27 |
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
| 28 |
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
| 29 |
+
<modelVersion>4.0.0</modelVersion>
|
| 30 |
+
<groupId>com.example.billing</groupId>
|
| 31 |
+
<artifactId>invoice-service</artifactId>
|
| 32 |
+
<version>2.4.1</version>
|
| 33 |
+
|
| 34 |
+
<properties>
|
| 35 |
+
<java.version>21</java.version>
|
| 36 |
+
<itext.version>9.2.0</itext.version>
|
| 37 |
+
</properties>
|
| 38 |
+
|
| 39 |
+
<dependencies>
|
| 40 |
+
<dependency>
|
| 41 |
+
<groupId>com.itextpdf</groupId>
|
| 42 |
+
<artifactId>kernel</artifactId>
|
| 43 |
+
<version>${itext.version}</version>
|
| 44 |
+
</dependency>
|
| 45 |
+
<dependency>
|
| 46 |
+
<groupId>com.itextpdf</groupId>
|
| 47 |
+
<artifactId>layout</artifactId>
|
| 48 |
+
<version>${itext.version}</version>
|
| 49 |
+
</dependency>
|
| 50 |
+
<dependency>
|
| 51 |
+
<groupId>com.itextpdf</groupId>
|
| 52 |
+
<artifactId>forms</artifactId>
|
| 53 |
+
<version>${itext.version}</version>
|
| 54 |
+
</dependency>
|
| 55 |
+
<dependency>
|
| 56 |
+
<groupId>com.itextpdf</groupId>
|
| 57 |
+
<artifactId>html2pdf</artifactId>
|
| 58 |
+
<version>6.2.0</version>
|
| 59 |
+
</dependency>
|
| 60 |
+
<!-- legacy statement module, still on iText 5 -->
|
| 61 |
+
<dependency>
|
| 62 |
+
<groupId>com.itextpdf</groupId>
|
| 63 |
+
<artifactId>itextpdf</artifactId>
|
| 64 |
+
<version>5.5.13</version>
|
| 65 |
+
</dependency>
|
| 66 |
+
<dependency>
|
| 67 |
+
<groupId>org.springframework.boot</groupId>
|
| 68 |
+
<artifactId>spring-boot-starter-web</artifactId>
|
| 69 |
+
<version>3.5.6</version>
|
| 70 |
+
</dependency>
|
| 71 |
+
</dependencies>
|
| 72 |
+
</project></textarea>
|
| 73 |
+
<div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div>
|
| 74 |
+
<div id="out" aria-live="polite"></div>
|
| 75 |
+
<div id="paid"><strong>Free here:</strong> Maps every iText (AGPLv3) dependency in the open pom.xml or build.gradle to its line and the exact OpenPDF 3.0.5 or PDFBox 3.0.8 line that replaces it.. <strong>In the editor:</strong> Whole-workspace migration plan: every module and every iText artifact mapped to its replacement in a dated report, plus a CI gate that fails a build adding new com.itextpdf use. — that part asks for a licence key.</div>
|
| 76 |
+
<p class="note">Same engine as the VS Code extension, byte for byte.</p>
|
| 77 |
+
</div>
|
| 78 |
+
<script>var OPM_RULES = [
|
| 79 |
+
{"id": "ITX001", "sev": "error", "kind": "dep", "art": "^itextpdf$", "to": "com.github.librepdf:openpdf:3.0.5", "api": "change imports com.itextpdf.text.* to org.openpdf.text.* (Document, Paragraph, PdfWriter, PdfPTable keep their names)",
|
| 80 |
+
"msg": "iText 5 (com.itextpdf:itextpdf) is AGPLv3: iText states that iText 5 and all later versions are dual-licensed AGPLv3 or commercial. Replace with OpenPDF 3.0.5 (LGPL 2.1 / MPL 2.0)."},
|
| 81 |
+
{"id": "ITX002", "sev": "error", "kind": "dep", "art": "^(itext7-core|itext-core)$", "to": "com.github.librepdf:openpdf:3.0.5", "api": "split by job: page generation to OpenPDF, reading, form filling and signing to org.apache.pdfbox:pdfbox:3.0.8",
|
| 82 |
+
"msg": "The iText Core bundle pulls in every AGPLv3 iText module (kernel, io, layout, forms, sign, pdfa and more). Replace the bundle with the one library each job needs."},
|
| 83 |
+
{"id": "ITX003", "sev": "error", "kind": "dep", "art": "^kernel$", "to": "com.github.librepdf:openpdf:3.0.5", "api": "PdfDocument + PdfWriter become org.openpdf.text.Document + org.openpdf.text.pdf.PdfWriter; for reading or editing existing PDFs use org.apache.pdfbox:pdfbox:3.0.8 (PDDocument)",
|
| 84 |
+
"msg": "iText kernel (com.itextpdf:kernel) is the AGPLv3 core every other iText module depends on. Replace with OpenPDF 3.0.5 to write PDFs, or Apache PDFBox 3.0.8 (Apache 2.0) to read and edit them."},
|
| 85 |
+
{"id": "ITX004", "sev": "error", "kind": "dep", "art": "^layout$", "to": "com.github.librepdf:openpdf:3.0.5", "api": "Paragraph, Table and Cell become org.openpdf.text.Paragraph and org.openpdf.text.pdf.PdfPTable / PdfPCell",
|
| 86 |
+
"msg": "iText layout (com.itextpdf:layout) is AGPLv3. Replace with OpenPDF 3.0.5, which keeps the Document / Paragraph / PdfPTable model."},
|
| 87 |
+
{"id": "ITX005", "sev": "error", "kind": "dep", "art": "^io$", "to": "com.github.librepdf:openpdf:3.0.5", "api": "fonts and images move to org.openpdf.text.pdf.BaseFont and org.openpdf.text.Image",
|
| 88 |
+
"msg": "iText io (com.itextpdf:io) is AGPLv3 and only exists to serve iText kernel. Remove it together with kernel; OpenPDF 3.0.5 carries its own font and image classes."},
|
| 89 |
+
{"id": "ITX006", "sev": "error", "kind": "dep", "art": "^forms$", "to": "org.apache.pdfbox:pdfbox:3.0.8", "api": "PdfAcroForm becomes org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm (getField(name).setValue(v))",
|
| 90 |
+
"msg": "iText forms (com.itextpdf:forms) is AGPLv3. Fill and flatten AcroForms with Apache PDFBox 3.0.8 (Apache 2.0) instead."},
|
| 91 |
+
{"id": "ITX007", "sev": "error", "kind": "dep", "art": "^sign$", "to": "org.apache.pdfbox:pdfbox:3.0.8", "api": "PdfSigner becomes PDDocument.addSignature(PDSignature, SignatureInterface) with your own CMS signer",
|
| 92 |
+
"msg": "iText sign (com.itextpdf:sign) is AGPLv3. Apache PDFBox 3.0.8 signs PDFs through PDSignature and a SignatureInterface you implement (for example with Bouncy Castle)."},
|
| 93 |
+
{"id": "ITX008", "sev": "error", "kind": "dep", "art": "^pdfa$", "to": "org.apache.pdfbox:preflight:3.0.8", "api": "write PDF/A with PDFBox (XMP metadata + OutputIntent) and validate the result with org.apache.pdfbox:preflight:3.0.8",
|
| 94 |
+
"msg": "iText pdfa (com.itextpdf:pdfa) is AGPLv3. Build PDF/A output with Apache PDFBox 3.0.8 and check conformance with PDFBox Preflight 3.0.8."},
|
| 95 |
+
{"id": "ITX009", "sev": "error", "kind": "dep", "art": "^html2pdf$", "to": "com.github.librepdf:openpdf-html:3.0.5", "api": "HtmlConverter.convertToPdf(html, out) becomes a Flying Saucer style renderer on OpenPDF (openpdf-html 3.0.5, or org.xhtmlrenderer:flying-saucer-pdf 10.5.0)",
|
| 96 |
+
"msg": "iText pdfHTML (com.itextpdf:html2pdf) is an AGPLv3 add-on. Render HTML to PDF with openpdf-html 3.0.5 on top of OpenPDF instead."},
|
| 97 |
+
{"id": "ITX010", "sev": "error", "kind": "dep", "art": "^barcodes$", "to": "com.github.librepdf:openpdf:3.0.5", "api": "BarcodeQRCode / Barcode128 move to org.openpdf.text.pdf.Barcode128 and BarcodePDF417",
|
| 98 |
+
"msg": "iText barcodes (com.itextpdf:barcodes) is AGPLv3. OpenPDF 3.0.5 ships Barcode128, BarcodeEAN and BarcodePDF417."},
|
| 99 |
+
{"id": "ITX011", "sev": "error", "kind": "dep", "art": "^(svg|styled-xml-parser|hyph|font-asian|pdfua|commons)$", "to": "com.github.librepdf:openpdf:3.0.5", "api": "these modules only serve iText kernel and layout; remove them in the same commit",
|
| 100 |
+
"msg": "This iText support module is AGPLv3 and has no job once kernel and layout are gone. Remove it with them."},
|
| 101 |
+
{"id": "ITX012", "sev": "warn", "kind": "dep", "art": "^bouncy-castle-(adapter|fips-adapter|connector)$", "to": "org.apache.pdfbox:pdfbox:3.0.8", "api": "depend on org.bouncycastle directly if your PDFBox signer needs it",
|
| 102 |
+
"msg": "The iText Bouncy Castle adapter is AGPLv3 and exists only for iText sign. Remove it when sign goes."},
|
| 103 |
+
{"id": "ITX013", "sev": "error", "kind": "dep", "art": ".", "to": "", "api": "no drop-in open replacement: decide per feature (drop it, rebuild it on PDFBox, or keep a commercial iText licence for this module only)",
|
| 104 |
+
"msg": "This com.itextpdf add-on is sold under AGPLv3 or commercial terms and has no one-line open replacement."},
|
| 105 |
+
{"id": "ITX014", "sev": "warn", "kind": "import", "re": "^\\s*import\\s+(static\\s+)?com\\.itextpdf\\.", "to": "", "api": "com.itextpdf.text.* becomes org.openpdf.text.*; com.itextpdf.kernel / layout become OpenPDF or PDFBox classes",
|
| 106 |
+
"msg": "Java or Kotlin source still imports com.itextpdf: this line breaks the build once the iText dependency is removed."},
|
| 107 |
+
{"id": "ITX015", "sev": "info", "kind": "prop", "re": "^\\s*(?:\u003c\\s*(itext[\\w.-]*version)\\s*\u003e\\s*([^\u003c]*?)\\s*\u003c|(?:def\\s+|val\\s+|ext\\.)?(itext\\w*[Vv]ersion|itext_version)\\s*=\\s*['\"]([^'\"]*)['\"])", "to": "", "api": "delete it after the last com.itextpdf dependency is replaced, or it keeps inviting iText back",
|
| 108 |
+
"msg": "Version property for iText."}
|
| 109 |
+
]
|
| 110 |
+
;</script>
|
| 111 |
+
<script>/* OpenPDF migration check — shared engine (VS Code + web page). */
|
| 112 |
+
(function () {
|
| 113 |
+
var DOC = (typeof module !== 'undefined' && module.exports && typeof require !== 'undefined') ? require('./rules.json')
|
| 114 |
+
: (typeof window !== 'undefined' ? window.OPM_RULES : []);
|
| 115 |
+
var RULES = Array.isArray(DOC) ? DOC : (DOC && DOC.rules) || [];
|
| 116 |
+
var DEPS = RULES.filter(function (r) { return r.kind === 'dep'; });
|
| 117 |
+
|
| 118 |
+
// Blank comments char-for-char so offsets (and line numbers) stay put.
|
| 119 |
+
function blank(s) {
|
| 120 |
+
return s.replace(/<!--[\s\S]*?-->/g, function (c) { return c.replace(/[^\n]/g, ' '); })
|
| 121 |
+
.replace(/\/\*[\s\S]*?\*\//g, function (c) { return c.replace(/[^\n]/g, ' '); })
|
| 122 |
+
.replace(/(^|[^:'"])\/\/[^\n]*/g, function (c, p) { return p + c.slice(p.length).replace(/[^\n]/g, ' '); });
|
| 123 |
+
}
|
| 124 |
+
function lineAt(s, i) { return s.slice(0, i).split('\n').length; }
|
| 125 |
+
function tag(block, name) { var m = new RegExp('<' + name + '>\\s*([^<]*?)\\s*</' + name + '>').exec(block); return m ? m[1] : null; }
|
| 126 |
+
function flat(s) { return String(s).replace(/\s+/g, ' ').trim(); }
|
| 127 |
+
|
| 128 |
+
function props(src) {
|
| 129 |
+
var p = {}, re = /<([\w.-]+)>\s*([^<]*?)\s*<\/\1>/g, blk = /<properties>([\s\S]*?)<\/properties>/.exec(src), m;
|
| 130 |
+
if (blk) while ((m = re.exec(blk[1]))) p[m[1]] = m[2];
|
| 131 |
+
return p;
|
| 132 |
+
}
|
| 133 |
+
function resolve(v, p) { return v ? v.replace(/\$\{([^}]+)\}/g, function (a, k) { return p[k] !== undefined ? p[k] : a; }) : v; }
|
| 134 |
+
|
| 135 |
+
function deps(src) {
|
| 136 |
+
var out = [], p = props(src), m;
|
| 137 |
+
var pom = /<dependency>([\s\S]*?)<\/dependency>/g;
|
| 138 |
+
while ((m = pom.exec(src))) {
|
| 139 |
+
var g = tag(m[1], 'groupId'), a = tag(m[1], 'artifactId');
|
| 140 |
+
if (g !== 'com.itextpdf' || !a) continue;
|
| 141 |
+
var at = m.index + m[0].indexOf('<artifactId>');
|
| 142 |
+
out.push({ art: a, ver: resolve(tag(m[1], 'version'), p), line: lineAt(src, at), text: flat(m[0]), pom: true });
|
| 143 |
+
}
|
| 144 |
+
var gr = /['"]com\.itextpdf:([\w.-]+)(?::([^'"\s:@)]+))?[^'"]*['"]|group\s*[:=]\s*['"]com\.itextpdf['"]\s*,\s*(?:name|module)\s*[:=]\s*['"]([\w.-]+)['"](?:\s*,\s*version\s*[:=]\s*['"]([^'"]+)['"])?/g;
|
| 145 |
+
while ((m = gr.exec(src))) {
|
| 146 |
+
var ls = src.lastIndexOf('\n', m.index) + 1, le = src.indexOf('\n', m.index);
|
| 147 |
+
out.push({ art: m[1] || m[3], ver: m[2] || m[4] || null, line: lineAt(src, m.index), text: flat(src.slice(ls, le < 0 ? src.length : le)), pom: false });
|
| 148 |
+
}
|
| 149 |
+
return out;
|
| 150 |
+
}
|
| 151 |
+
function line(coord, pom, kts) {
|
| 152 |
+
if (!coord) return '';
|
| 153 |
+
var c = coord.split(':');
|
| 154 |
+
if (pom) return '<dependency><groupId>' + c[0] + '</groupId><artifactId>' + c[1] + '</artifactId><version>' + c[2] + '</version></dependency>';
|
| 155 |
+
return kts ? 'implementation("' + coord + '")' : "implementation '" + coord + "'";
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
function check(text, opts) {
|
| 159 |
+
opts = opts || {};
|
| 160 |
+
var raw = String(text || '').replace(/\r\n?/g, '\n'), src = blank(raw), findings = [];
|
| 161 |
+
var kts = /implementation\s*\(/.test(src);
|
| 162 |
+
deps(src).forEach(function (d) {
|
| 163 |
+
var r = DEPS.filter(function (x) { return new RegExp(x.art).test(d.art); })[0];
|
| 164 |
+
if (!r) return;
|
| 165 |
+
var repl = line(r.to, d.pom, kts);
|
| 166 |
+
findings.push({ check: r.id, sev: r.sev, line: d.line, text: d.text, fix: repl || r.api,
|
| 167 |
+
msg: r.msg + ' Found: com.itextpdf:' + d.art + (d.ver ? ' ' + d.ver : '') + '.' + (repl ? ' Replace with: ' + repl + '.' : '') + ' Code: ' + r.api + '.' });
|
| 168 |
+
});
|
| 169 |
+
var lines = src.split('\n');
|
| 170 |
+
RULES.forEach(function (r) {
|
| 171 |
+
if (r.kind !== 'import' && r.kind !== 'prop') return;
|
| 172 |
+
var re = new RegExp(r.re, 'i');
|
| 173 |
+
lines.forEach(function (l, i) {
|
| 174 |
+
var m = re.exec(l);
|
| 175 |
+
if (!m) return;
|
| 176 |
+
var extra = r.kind === 'prop' ? ' Found: ' + (m[1] || m[3]) + ' = ' + (m[2] || m[4]) + '.' : '';
|
| 177 |
+
findings.push({ check: r.id, sev: r.sev, line: i + 1, text: flat(raw.split('\n')[i]), fix: r.api, msg: r.msg + extra + ' Next: ' + r.api + '.' });
|
| 178 |
+
});
|
| 179 |
+
});
|
| 180 |
+
findings.sort(function (a, b) { return a.line - b.line; });
|
| 181 |
+
var today = /^\d{4}-\d{2}-\d{2}/.exec(String(opts.today || ''));
|
| 182 |
+
return { findings: findings, checked: today ? today[0] : null, itext_uses: findings.filter(function (f) { return f.check !== 'ITX015'; }).length };
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
var api = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length };
|
| 186 |
+
if (typeof module !== 'undefined' && module.exports) module.exports = api;
|
| 187 |
+
if (typeof window !== 'undefined') window.OPMENGINE = api;
|
| 188 |
+
})();
|
| 189 |
+
</script>
|
| 190 |
+
<script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다.
|
| 191 |
+
'use strict';
|
| 192 |
+
function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); }
|
| 193 |
+
function summaryLine(res) {
|
| 194 |
+
const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length;
|
| 195 |
+
return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.';
|
| 196 |
+
}
|
| 197 |
+
function toText(res, label) {
|
| 198 |
+
const f = (res && res.findings) || [];
|
| 199 |
+
const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)];
|
| 200 |
+
f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); });
|
| 201 |
+
return lines.join('\n');
|
| 202 |
+
}
|
| 203 |
+
function toHtml(res) {
|
| 204 |
+
const f = (res && res.findings) || [];
|
| 205 |
+
if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>';
|
| 206 |
+
const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join('');
|
| 207 |
+
return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>';
|
| 208 |
+
}
|
| 209 |
+
var OPMREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml };
|
| 210 |
+
if (typeof module !== 'undefined' && module.exports) module.exports = OPMREPORT;
|
| 211 |
+
else window.OPMREPORT = OPMREPORT;
|
| 212 |
+
</script>
|
| 213 |
+
<script>
|
| 214 |
+
(function(){
|
| 215 |
+
var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today');
|
| 216 |
+
today.value=new Date().toISOString().slice(0,10);
|
| 217 |
+
function run(){ try { var res=window.OPMENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.OPMREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } }
|
| 218 |
+
go.onclick=run; if (src.value.trim()) run();
|
| 219 |
+
})();
|
| 220 |
+
</script>
|
| 221 |
+
|
| 222 |
+
|
| 223 |
+
<section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://open-vsx.org/extension/readystack/openpdf-migration-check" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'openpdf-migration-check',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/team" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section>
|
| 224 |
+
<section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind OpenPDF Migration Check: iText AGPL Gate every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"openpdf-migration-check",lang:"en",source:"rule_alert"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);document.addEventListener("click",function(ev){var b=ev.target&&ev.target.closest?ev.target.closest("button,input[type=submit]"):null;if(b&&!b.closest("[data-yj],[data-yj-cta],[data-yj-install],[data-yj-alert],.yj-find,.yj-related,#yj-ask,.yjp"))mv(ev);},true);})();</script></section>
|
| 225 |
+
|
| 226 |
+
<section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the full version <span class="yj-price">$29</span></h2><p class="yj-cta-paid" style="margin:.25rem 0 .6rem;color:#1f2a37">Whole-workspace migration plan: every module and every iText artifact mapped to its replacement in a dated report, plus a CI gate that fails a build adding new com.itextpdf use.</p><p class="yj-cta-pay" style="margin:.25rem 0 1rem;color:#5b6b7c;font-size:.94rem">One payment, one licence key for this tool. The key is shown right after payment.</p><p class="yj-cta-anchor" style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Aspose.PDF for Java Developer Small Business licence: US$1,199 per developer; iText publishes no price on its AGPLv3 page</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_z71RgNMNnZWOUGkjXrzgvbrA9UiJ9W8AQiFl01Yg5HE" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section>
|
| 227 |
+
<!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script>
|
| 228 |
+
<script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script>
|
| 229 |
+
|
| 230 |
+
<script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&","<":"<",">":">",'"':"""}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-09-30">Updated 2026-09-30</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-09-30","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku427973_result_card.jpg" alt="Migrate from iText to OpenPDF: 6 findings in one pom.xml" loading="lazy" style="max-width:100%;border-radius:6px"></p>
|
| 231 |
+
<p>6 findings in one pom.xml: that is what a Java invoice service on iText 9.2.0, with one legacy iText 5.5.13 module, shows when every iText line is mapped to OpenPDF or Apache PDFBox. If you are a Java team shipping closed-source software or a SaaS backend that renders PDFs, this is the list you need before the next release.</p>
|
| 232 |
+
<h3>What iText says</h3>
|
| 233 |
+
<p>iText's licensing page is short and plain: "iText 5 and all subsequent versions of iText are dual-licensed, and available under open source (AGPLv3) or commercial license agreements." Under the AGPLv3 option: "You may not deploy it on a network without disclosing the full source code of your own applications under the AGPL license." So a closed product or a web service on iText 7, 8 or 9 either publishes its source or holds a commercial licence. iText publishes no price on that page.</p>
|
| 234 |
+
<h3>The two open replacements</h3>
|
| 235 |
+
<p>Both are on Maven Central (checked 2026-09-30):</p>
|
| 236 |
+
<ul><li>OpenPDF <code>com.github.librepdf:openpdf:3.0.5</code>, LGPL 2.1 / MPL 2.0, plus <code>openpdf-html:3.0.5</code> for HTML to PDF</li><li>Apache PDFBox <code>org.apache.pdfbox:pdfbox:3.0.8</code>, Apache 2.0, plus <code>preflight:3.0.8</code> for PDF/A checks</li></ul>
|
| 237 |
+
<p>OpenPDF is the natural home for code that builds documents (Document, Paragraph, PdfPTable). PDFBox is the home for code that opens existing PDFs, fills AcroForms or signs.</p>
|
| 238 |
+
<p>One trap: OpenPDF 3 moved its classes from <code>com.lowagie.text</code> to <code>org.openpdf.text</code>. Many snippets online, and many chatbot answers, still import <code>com.lowagie</code>, which does not compile against 3.0.5.</p>
|
| 239 |
+
<h3>The sample pom.xml, line by line</h3>
|
| 240 |
+
<pre><code><itext.version>9.2.0</itext.version>
|
| 241 |
+
<artifactId>kernel</artifactId> <!-- ${itext.version} -->
|
| 242 |
+
<artifactId>layout</artifactId>
|
| 243 |
+
<artifactId>forms</artifactId>
|
| 244 |
+
<artifactId>html2pdf</artifactId> <!-- 6.2.0 -->
|
| 245 |
+
<artifactId>itextpdf</artifactId> <!-- 5.5.13 --></code></pre>
|
| 246 |
+
<p>The check resolves <code>${itext.version}</code> and reports:</p>
|
| 247 |
+
<ol><li><code>itext.version</code> 9.2.0: delete it once the last iText line is gone</li><li><code>kernel</code> 9.2.0 → <code>openpdf</code> 3.0.5 to write, <code>pdfbox</code> 3.0.8 to read or edit</li><li><code>layout</code> 9.2.0 → <code>openpdf</code> 3.0.5</li><li><code>forms</code> 9.2.0 → <code>pdfbox</code> 3.0.8 (PDAcroForm)</li><li><code>html2pdf</code> 6.2.0 → <code>openpdf-html</code> 3.0.5</li><li><code>itextpdf</code> 5.5.13 → <code>openpdf</code> 3.0.5, imports <code>com.itextpdf.text</code> become <code>org.openpdf.text</code></li></ol>
|
| 248 |
+
<p>Each finding carries the ready-made <code><dependency></code> block, or <code>implementation(...)</code> for Gradle Kotlin DSL.</p>
|
| 249 |
+
<h3>Gradle projects</h3>
|
| 250 |
+
<p>The same 15 rules read <code>build.gradle</code> and <code>build.gradle.kts</code>: string coordinates, <code>group:/name:</code> maps, and version variables such as <code>itextVersion</code>. A Kotlin DSL file with the <code>itext-core</code> 9.8.0 bundle, <code>sign</code> and the Bouncy Castle adapter gives 3 findings: split the bundle by job, move signing to PDFBox, drop the adapter.</p>
|
| 251 |
+
<h3>What it will not do</h3>
|
| 252 |
+
<p>It is a dependency map, not legal advice. It reads the file in front of it, not the resolved tree, so run <code>mvn dependency:tree</code> to catch iText pulled in by another library.</p>
|
| 253 |
+
<h3>Try it</h3>
|
| 254 |
+
<p>Open your pom.xml in VS Code with the extension, or paste it into the web page. The whole map is free. A licence key adds the whole workspace as one dated migration plan and a CI gate that fails a build adding new com.itextpdf use.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku427973_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku427973_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does OpenPDF Migration Check do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads a pom.xml, build.gradle or build.gradle.kts and lists every iText (com.itextpdf) dependency with its line number and the exact OpenPDF 3.0.5 or Apache PDFBox 3.0.8 line that replaces it. It has 15 rules. On the bundled sample pom.xml it reports 6 findings: kernel, layout, forms, html2pdf, itextpdf 5.5.13 and the itext.version property.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is the iText to OpenPDF check for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Java teams that ship closed-source software or run a SaaS backend and generate PDFs with iText 5, 7, 8 or 9. iText states that iText 5 and all later versions are dual-licensed AGPLv3 or commercial, so those teams either publish their application source or move to OpenPDF or Apache PDFBox.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just ask a chatbot or grep for itext?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A grep finds the word itext but does not say which library replaces each module: forms and sign go to PDFBox, layout goes to OpenPDF, html2pdf goes to openpdf-html. Chatbot snippets often import com.lowagie.text, which OpenPDF 3 renamed to org.openpdf.text. The check gives the replacement line per module, with current versions from Maven Central.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what needs a licence key?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Free, without a key: the open file, all findings from the 15 rules, and every replacement line. A licence key adds the whole workspace at once as one dated migration plan, every module and iText artifact mapped to its replacement, and a CI gate that fails a build adding new com.itextpdf use. One payment, not a subscription.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does the alternative cost?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Staying on iText in closed-source or SaaS code means a commercial iText licence; iText publishes no price on its AGPLv3 page. Switching to another commercial Java PDF library costs money too: Aspose.PDF for Java lists its Developer Small Business licence at US$1,199 per developer. OpenPDF and Apache PDFBox are open source.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does OpenPDF Migration Check do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads a pom.xml, build.gradle or build.gradle.kts and lists every iText (com.itextpdf) dependency with its line number and the exact OpenPDF 3.0.5 or Apache PDFBox 3.0.8 line that replaces it. It has 15 rules. On the bundled sample pom.xml it reports 6 findings: kernel, layout, forms, html2pdf, itextpdf 5.5.13 and the itext.version property."}}, {"@type": "Question", "name": "Who is the iText to OpenPDF check for?", "acceptedAnswer": {"@type": "Answer", "text": "Java teams that ship closed-source software or run a SaaS backend and generate PDFs with iText 5, 7, 8 or 9. iText states that iText 5 and all later versions are dual-licensed AGPLv3 or commercial, so those teams either publish their application source or move to OpenPDF or Apache PDFBox."}}, {"@type": "Question", "name": "Why not just ask a chatbot or grep for itext?", "acceptedAnswer": {"@type": "Answer", "text": "A grep finds the word itext but does not say which library replaces each module: forms and sign go to PDFBox, layout goes to OpenPDF, html2pdf goes to openpdf-html. Chatbot snippets often import com.lowagie.text, which OpenPDF 3 renamed to org.openpdf.text. The check gives the replacement line per module, with current versions from Maven Central."}}, {"@type": "Question", "name": "What is free and what needs a licence key?", "acceptedAnswer": {"@type": "Answer", "text": "Free, without a key: the open file, all findings from the 15 rules, and every replacement line. A licence key adds the whole workspace at once as one dated migration plan, every module and iText artifact mapped to its replacement, and a CI gate that fails a build adding new com.itextpdf use. One payment, not a subscription."}}, {"@type": "Question", "name": "What does the alternative cost?", "acceptedAnswer": {"@type": "Answer", "text": "Staying on iText in closed-source or SaaS code means a commercial iText licence; iText publishes no price on its AGPLv3 page. Switching to another commercial Java PDF library costs money too: Aspose.PDF for Java lists its Developer Small Business licence at US$1,199 per developer. OpenPDF and Apache PDFBox are open source."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:427973,slug:"openpdf-migration-check",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/maven-central-publish-gate"><span class="yj-rel-t">Maven Central Publish Gate</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/cinc-migration-check"><span class="yj-rel-t">Cinc Migration Check: Chef Infra licence gate lint</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/ferretdb-migration-lint"><span class="yj-rel-t">FerretDB Migration Lint — MongoDB SSPL gate</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/pekko-migration-gate"><span class="yj-rel-t">Pekko Migration Gate — Akka BSL licence check</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/pyside6-migration-lint"><span class="yj-rel-t">PySide6 Migration Lint: PyQt5/PyQt6 Licence Gate</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/dotnet-eol-support-gate"><span class="yj-rel-t">.NET EOL & CRA Support Window Gate</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section></body>
|
| 255 |
</html>
|